Rust基本语法整理(三)

通道的发送端有一个 send 方法用来获取需要放入通道的值。send 方法返回一个 Result<T, E> 类型,所以如果接收端已经被丢弃了,将没有发送值的目标,所以发送操作会返回错误。在这个例子中,出错的时候调用 unwrap 产生 panic

recv,它是 receive 的缩写。这个方法会阻塞主线程执行直到从通道中接收一个值。一旦发送了一个值,recv 会在一个 Result<T, E> 中返回它。当通道发送端关闭,recv 会返回一个错误表明不会再有新的值到来了
try_recv 不会阻塞,相反它立刻返回一个 Result<T, E>:Ok 值包含可用的信息,而 Err 值代表此时没有任何消息

send 函数获取其参数的所有权并移动这个值归接收者所有。这个意味着不可能意外的在发送后再次使用这个值;所有权系统检查一切是否合乎规则
which does not implement the Copy trait 跨线程访问
使用 Arc 包装一个 Mutex 能够实现在多线程之间共享所有权
这意味着 Mutex 提供了内部可变性,就像 Cell 系列类型那样。正如第十五章中使用 RefCell 可以改变 Rc 中的内容那样,同样的可以使用 Mutex 来改变 Arc 中的内容。
std::marker 中的 Sync 和 Send trait。
Send 标记 trait 表明类型的所有权可以在线程间传递。几乎所有的 Rust 类型都是Send 的,不过有一些例外,包括 Rc:这是不能 Send 的
Sync 标记 trait 表明一个实现了 Sync 的类型可以安全的在多个线程中拥有其值的引用。换一种方式来说
对于任意类型 T,如果 &T(T 的引用)是 Send 的话 T 就是 Sync 的

trait 对象而不是继承。让我们看一下 Rust 中的 trait 对象是如何实现多态的。
这个 vector 的类型是 Box,此为一个 trait 对象:它是 Box 中任何实现了 Draw trait 的类型的替身
Screen 实例必须拥有一个全是 Button 类型或者全是 TextField 类型的组件列表。如果只需要同质(相同类型)集合,则倾向于使用泛型和 trait bound

对象安全(object safe)的 trait 才可以组成 trait 对象
返回值类型不为 Self
方法没有任何泛型类型参数

注意不同于使用 self、 &self 或者 &mut self 作为方法的第一个参数,这里使用了 self: Box。这个语法意味着这个方法调用只对这个类型的 Box 有效。这个语法获取了 Box 的所有权
Option 的 as_ref 方法是因为需要 Option 中值的引用而不是获取其所有权

一个与 if let 结构类似的是 while let 条件循环,它允许只要模式匹配就一直进行 while 循环
模式有两种形式:refutable(可反驳的)和 irrefutable(不可反驳的)。能匹配任何传递的可能值的模式被称为是 不可反驳的(irrefutable)。一个例子就是 let x = 5; 语句中的 x,因为 x 可以匹配任何值所以不可能会失败。对某些可能的值进行匹配会失败的模式被称为是 可反驳的(refutable)。一个这样的例子便是 if let Some(x) = a_value 表达式中的 Some(x);如果变量 a_value 中的值是 None 而不是 Some,那么 Some(x) 模式不能匹配

match
…= 语法允许你匹配一个闭区间范围内的值
范围只允许用于数字或 char 值,因为编译器会在编译时检查范围不为空。char 和 数字值是 Rust 仅有的可以判断范围是否为空的类型
对于像 Message::Write 这样的包含一个元素,以及像 Message::ChangeColor 这样包含两个元素的类元组枚举成员,其模式则类似于用于解构元组的模式。模式中变量的数量必须与成员中元素的数量一致
在函数签名中使用 _
这段代码会完全忽略作为第一个参数传递的值 3
匹配守卫(match guard)是一个指定于 match 分支模式之后的额外 if 条件
@ 绑定
at 运算符(@)允许我们在创建一个存放值的变量的同时测试其值是否匹配模式

裸指针(raw pointers)的类似于引用的新类型。和引用一样,裸指针是可变或不可变的,分别写作 *const T 和 *mut T
外部函数接口(Foreign Function Interface, FFI)
也可以使用 extern 来创建一个允许其他语言调用 Rust 函数的接口。不同于 extern 块,就在 fn 关键字之前增加 extern 关键字并指定所用到的 ABI。还需增加 #[no_mangle] 注解来告诉 Rust 编译器不要 mangle 此函数的名称

猜你喜欢

转载自blog.csdn.net/JIYILANZHOU/article/details/107580235