Blog

rust语言基础学习: rust中的slice类型

📅 2020-07-25

今天来学习Rust中的slice类型。

为什么需要slice类型 #

为什么Rust会提供slice类型呢?

Rust中的借用(Borrow语义)可以将一个值在其所有权不发生转移的情况下,借给其他变量使用,借用通过创建引用来实现,Rust中创建引用的行为被称为借用。 但对于常用的集合类型例如Vec<T>, String(String的底层是Vec<u8>),这些集合类型的引用类型&Vec<T>, &String,引用的将是整个集合的内容。

...

rust语言基础学习: 使用ref关键字在模式匹配中通过引用进行绑定

📅 2020-07-24

今天来学习rust中的ref关键字。

由一个例子引出ref关键字的使用 #

先看下面的例子。

例1:

 1
 2#[derive(Debug)]
 3enum HttpMethod {
 4    Get(Get),
 5    Post(Post),
 6}
 7
 8#[derive(Debug)]
 9struct Get {
10    url: String,
11}
12
13#[derive(Debug)]
14struct Post {
15    url: String,
16    body: Vec<u8>,
17}
18 
19 fn main() {
20    let method = HttpMethod::Get(Get{
21        url: String::from("https://google.com"),
22    });
23
24    match  method  {
25        HttpMethod::Get(get) => println!("send get reuqest: {:?}", get),
26        HttpMethod::Post(post) => println!("send post reuqest: {:?}", post),
27    }
28
29    println!("{:?}", method); // 编译错误: borrow of partially moved value: `method`
30     
31 }

上面例1中在使用match表达式进行模式匹配时,在执行第25行或26行时method会发生部分移动(partially moved),根据rust所有权规则中的Move语义,method将失去所有权,因此在第29行无法再使用method变量,报了编译错误。

...

rust语言基础学习: 内存相关的3个trait, Clone, Copy, Drop

📅 2020-07-23

昨天我们学习了AsRef和AsMut两个trait,使用这两个trait可以实现引用到引用的转换:

  • 如果类型U实现了AsRef<T>,则as_ref可以实现&U&T的转换
  • 如果类型U实现了AsMut<T>,则as_ref可以实现从&U&mut T的转换
  • 如果T实现了AsRef<U>,那么&T就实现了AsRef<U>
  • 如果T实现了AsRef<U>,那么&mut T就实现了AsRef<U>
  • 如果T实现了AsMut<U>,那么&mut T就实现了AsMut<U>

到目前为止我们已经学习了Rust标准库中的11个常用的trait:

...

rust语言基础学习: 使用Default trait为类型提供缺省值

📅 2020-07-21

继续学习Rust标准库中常用的trait,在开始今天的学习之前,先把前面已经学过的trait做一个简单的复习:

  • std::str::FromStr 用于字符串slice str到其他类型的转换,一个名称为Point的类型实现了FromStr trait后,调用Point::from_str()就能完成从str到Point的转换,也可以使用str.parse()隐式调用的形式。
  • std::ops::Deref 用于不可变引用的解引用操作,Deref用于不可变引用的解引用操作,如*v。 实现Deref trait允许我们重载不可变引用的解引用运算符*。 实现了Deref trait的智能指针可以被当做常规引用来对待,以便于访问其智能指针背后的数据。Rust为了提高在函数或方法传参时的便利性,提供了Deref强制转换(Deref coercion)功能。
  • std::ops::DerefMut 用于可变引用的解引用操作,如*v = 1;。 实现DerefMut trait允许我们重载可变应用的解引用运算符*。 实现了DerefMut trait的智能指针可以被当做常规可变引用来对待。因为DerefMut tait继承了Deref trait,因此也具有"Deref强制转换功能"。
  • std::convert::From 如果一个类型实现了From<T>,则可以使用from实现从输入的T转换到该类型。实现From trait会自动为From<T>中的T实现Into trait。使用From trait还可以用于简化错误处理,在进行错误传播当上下游错误类型不一致时,通过实现From trait,使用?操作符自动实现下游到上游的错误转换。
  • 类似于From和Into,std::convert::TryFromstd::convert::TryInto 适用于易出错的转换场景,TryFrom, TryInto对比From和Into,多了个关联类型Error,try_from和try_into函数的返回值是Result,可以返回转换时出现的错误。

我们已经学习了FromStr, Deref, DerefMut, From, Into, TryFrom, TryInto这7个标准库中的trait,今天学习Default trait,使用Default trait可以为类型提供缺省值。

...

rust语言基础学习: 使用From和TryFrom trait进行类型之间的转换

📅 2020-07-20

昨天学习了Rust中trait的基础知识,今天开始将学习由Rust标准库中提供的经常会用到的trait。

在之前我们已经学习过了FromStr, Deref, DerefMut这3个trait,这里先做一个复习。

1.复习FromStr, Deref, DerefMut trait #

std::str::FromStr用于字符串slice str到其他类型的转换,一个名称为Point的类型实现了FromStr trait后,调用Point::from_str()就能完成从str到Point的转换,也可以使用str.parse()隐式调用的形式。 需要注意FromStr没有生命周期参数,因此只能解析本身不包含生命周期的类型。

...

rust语言基础学习: 使用trait定义接口

📅 2020-07-19

trait类似于其他编程语言中的常被称为接口(interface)的功能,但还是有一些区别的。 trait告诉Rust编译器某个特定类型拥有可能与其他类型共享的功能。可以通过trait以一种抽象的方式定义共享的行为。可以使用trait bounds指定泛型是任何拥有特定行为的类型。

...

rust语言基础学习: rust中的错误处理

📅 2020-07-18

今天开始学习rust中错误处理的内容。

Rust中的错误可分为 可恢复错误(recoverable)不可恢复错误(unrecoverable) 两个类别。

  • 可恢复错误通常代表向用户报告错误和重试操作是合理的情况,例如未找到文件
  • 不可恢复错误会导致程序崩溃,例如尝试访问超过数组结尾的位置

对比其他编程语言的错误处理:

...

rust语言基础学习: Deref和DerefMut trait

📅 2020-07-17

前面我们学习了Box<T>, Rc<T>, RefCell<T>三个智能指针。 智能指针只是一种数据结构,它们的表现类似指针,同时有额外的元数据和功能。大多数智能指针拥有其所指向数据的所有权。 Rust中的智能指针通常使用结构体实现,其区别常规结构体的显著特征在于智能指针结构体会实现Deref trait和Drop trait,有的智能指针结构体还会实现DerefMut trait。

...

© 2024 青蛙小白 | 总访问量 | 总访客数