元数据

Rust权威指南

  •  Rust权威指南|200
  • 书名: Rust权威指南
  • 作者: 史蒂夫·克拉伯尼克 卡罗尔·尼科尔斯
  • 简介:
  • 出版时间
  • ISBN:
  • 分类:
  • 出版社: 电子工业出版社

高亮划线

泛型数据类型

  • 📌 None, ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-63-6610-6621
    • ⏱ 2023-07-06 11:39:27

使用迭代器处理元素序列

  • 📌 注意,这里的v1_iter必须是可变的,因为调用next方法改变了迭代器内部用来记录序列位置的状态。换句话说,这段代码消耗或使用了迭代器,每次调用next都吃掉了迭代器中的一个元素。在刚才的for循环中我们之所以不要求v1_iter可变,是因为循环取得了v1_iter的所有权并在内部使得它可变了。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-83-2994-3143

    • ⏱ 2023-07-07 07:58:01
  • 📌 另外还需要注意到,iter方法生成的是一个不可变引用的迭代器,我们通过next取得的值实际上是指向动态数组中各个元素的不可变引用。如果你需要创建一个取得v1所有权并返回元素本身的迭代器,那么你可以使用into_iter方法。类似地,如果你需要可变引用的迭代器,那么你可以使用iter_mut方法。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-83-3184-3332

    • ⏱ 2023-07-07 07:57:11

通过Deref trait将智能指针视作常规引用

  • 📌 只要代码涉及的类型实现了Deref trait,Rust就会自动分析类型并不断尝试插入Deref::deref来获得与参数类型匹配的引用。因为这一分析过程会在编译时完成,所以解引用转换不会在运行时产生任何额外的性能开销! ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-96-8603-8713
    • ⏱ 2023-07-07 13:50:10

RefCell和内部可变性模式

  • 📌 内部可变性(interior mutability)是Rust的设计模式之一,它允许你在只持有不可变引用的前提下对数据进行修改;通常而言,类似的行为会被借用规则所禁止。为了能够改变数据,内部可变性模式在它的数据结构中使用了unsafe(不安全)代码来绕过Rust正常的可变性和借用规则。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-99-543-758

    • ⏱ 2023-07-07 15:28:24
  • 📌 对于使用一般引用和Box的代码,Rust会在编译阶段强制代码遵守这些借用规则。而对于使用RefCell的代码,Rust则只会在运行时检查这些规则,并在出现违反借用规则的情况下触发panic来提前中止程序。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-99-1403-1602

    • ⏱ 2023-07-07 15:32:36

使用线程同时运行代码

  • 📌 也有许多编程语言提供了它们自身特有的线程实现,这种由程序语言提供的线程常常被称为绿色线程(green thread),使用绿色线程的语言会在拥有不同数量系统线程的环境下运行它们。为此,绿色线程也被称为M:N模型,它表示M个绿色线程对应着N个系统线程,这里的M与N不必相等。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-103-1373-1602
    • ⏱ 2023-07-07 17:43:28

使用消息传递在线程间转移数据

  • 📌 mpsc是英文“multiple producer, single consumer”(多个生产者,单个消费者)的缩写 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-104-1725-1784
    • ⏱ 2023-07-07 18:13:56

使用trait对象来存储不同类型的值

  • 📌 如果一个trait中定义的所有方法满足下面两条规则,那么这个trait就是对象安全的:• 方法的返回类型不是Self。• 方法中不包含任何泛型参数。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-110-9550-9706

    • ⏱ 2023-07-07 19:25:28
  • 📌 trait对象必须是对象安全的,因为Rust无法在我们使用trait对象时确定实现这个trait的具体类型究竟是什么。由于trait对象忘记了Self的具体类型,所以编译器无法在trait方法返回Self时使用原来的具体类型。同理,对于trait方法中的泛型参数而言,我们会在使用时将具体类型填入泛型所处的位置,这些具体类型会被视作当前类型的一部分。由于trait对象忘记了类型信息,所以我们无法确定被填入泛型参数处的类型究竟是哪一个。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-110-9782-10000

    • ⏱ 2023-07-07 19:27:14

所有可以使用模式的场合

  • 📌 match表达式必须穷尽(exhaustive)匹配值的所有可能性。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-114-1031-1131
    • ⏱ 2023-07-07 23:17:47

模式语法

  • 📌 _x语法仍然将值绑定到了变量上,而_则完全不会进行绑定。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-116-13246-13274

    • ⏱ 2023-07-07 23:51:08
  • 📌 通过在3…7之前使用id_variable @,我们在测试一个值是否满足区间模式的同时可以捕获到匹配成功的值。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-116-19960-20017

    • ⏱ 2023-07-08 00:03:21

不安全Rust

  • 📌 Rust的借用检查器无法理解我们正在借用一个切片的不同部分,它只知道我们借用了两次同一个切片。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-119-7871-7918

    • ⏱ 2023-07-08 00:27:58
  • 📌 在其他语言中调用Rust函数 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-119-11155-11169

    • ⏱ 2023-07-08 10:11:27
  • 📌 我们需要将extern关键字及对应的ABI添加到函数签名的fn关键字前,并为该函数添加#[no_mangle]注解来避免Rust在编译时改变它的名称。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-119-11274-11349

    • ⏱ 2023-07-08 10:11:47
  • 📌 static HELLO_WORLD: &str = “Hello, world!”; ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-119-12397-12441

    • ⏱ 2023-07-08 10:13:46
  • 📌 静态变量的名称会约定俗成地被写作SCREAMING_SNAKE_CASE的形式,并且必须要标注变量的类型 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-119-12635-12753

    • ⏱ 2023-07-08 10:13:38

高级trait

  • 📌 如果我们使用了示例19-13中的泛型版本,那么就需要在每次实现该trait的过程中标注类型 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-120-2345-2390

    • ⏱ 2023-07-08 10:21:11
  • 📌 借助关联类型,我们不需要在使用该trait的方法时标注类型,因为我们不能为单个类型多次实现这样的trait。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-120-2633-2687

    • ⏱ 2023-07-08 10:23:03
  • 📌 一般来说,完全限定语法被定义为如下所示的形式:::function(receiver_if_method, next_arg, …); ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-120-10974-11132

    • ⏱ 2023-07-08 10:39:29
  • 📌 只有当类型和对应trait中的任意一个定义在本地包内时,我们才能够为该类型实现这一trait。但实际上,你还可以使用newtype模式来巧妙地绕过这个限制,它会利用元组结构体创建出一个新的类型 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-120-14243-14339

    • ⏱ 2023-07-08 10:48:13

高级类型

  • 📌 类型别名最主要的用途是减少代码字符重复。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-121-2476-2496

    • ⏱ 2023-07-08 10:57:38
  • 📌 std::io有了如下所示的类型别名:type Result = Result<T, std::io::Error>; ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-121-4407-4555

    • ⏱ 2023-07-08 10:59:58
  • 📌 我们为何可以在一个分支中返回u32,而在另一个分支中以continue结束呢?正如你可能会猜到的,continue的返回类型是!。当Rust计算guess的类型时,它会发现在可用于匹配的两个分支中,前者的返回类型为u32而后者的返回类型为!。因为!无法产生一个可供返回的值,所以Rust采用了u32作为guess的类型。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-121-6493-6694

    • ⏱ 2023-07-08 11:08:54
  • 📌 panic! 宏的实现同样使用了never类型。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-121-6920-6944

    • ⏱ 2023-07-08 11:08:02

高级函数与闭包

  • 📌 函数会在传递的过程中被强制转换成fn类型 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-122-730-750

    • ⏱ 2023-07-08 11:16:07
  • 📌 由于函数指针实现了全部3种闭包trait(Fn、FnMut以及FnOnce),所以我们总是可以把函数指针用作参数传递给一个接收闭包的函数。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-122-1574-1643

    • ⏱ 2023-07-08 11:18:16
  • 📌 返回闭包 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-122-3126-3130

    • ⏱ 2023-07-08 11:23:51
  • 📌 使用trait对象 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-122-4163-4172

    • ⏱ 2023-07-08 11:24:05

把单线程服务器修改为多线程服务器

  • 📌 将通道用作一个普通的任务队列 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-127-19792-19806

    • ⏱ 2023-07-08 14:49:57
  • 📌 创建一个新的Job结构体来持有需要发送到通道中的闭包。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-127-20046-20073

    • ⏱ 2023-07-08 14:49:21
  • 📌 在本例中,由于while表达式内的值会把整个代码块视作自己的作用域,所以我们在调用job()的过程中仍然持有着锁 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-127-29806-29862

    • ⏱ 2023-07-08 15:12:26
  • 📌 通过使用loop并在循环代码块内部而不是外部请求锁和任务,lock方法中返回的MutexGuard会在let job语句结束后被立即丢弃。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-127-29950-30019

    • ⏱ 2023-07-08 15:14:14

优雅地停机与清理

  • 📌 这个错误意味着我们不能调用join,因为当前的代码仅仅是可变借用了worker,而join方法则要求取得其参数的所有权。为了解决这一问题,我们需要把线程移出拥有其所有权的Worker实例,以便join可以消耗掉它。示例17-15曾经完成过类似的工作:如果Worker持有的是一个Option<thread::JoinHandle<()>>,那么我们就可以在Option上调用take方法来将Some变体的值移出来,并在原来的位置留下None变体。换句话说,正在运行中的Worker会在thread中持有一个Some变体,当我们希望清理Worker时,就可以使用None来替换掉Some,从而使Worker失去可以运行的线程。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-128-2095-2407
    • ⏱ 2023-07-08 15:20:45

用于相等性比较的PartialEq和Eq

  • 📌 Eq trait本身没有方法,它的作用在于表明被标记类型的每一个值都与自身相等。Eq trait只能被应用在同时实现了PartialEq的类型上,尽管并不是所有实现了PartialEq的类型都能够实现Eq。一个典型的例子就是浮点数类型:浮点数类型的实现规范里明确指出两个非数(not-a-number,Nan)值的实例是互不相等的。例如,HashMap<K, V>中的键需要实现Eq trait,从而使得HashMap<K, V>可以判定两个键是否相同。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-139-928-1196
    • ⏱ 2023-07-08 15:36:30

使用PartialOrd和Ord进行次序比较

  • 📌 Ord trait表明被标注类型的任意两个值都存在一个有效的次序。 ^CB-DJh2zh2yr9pe6ha6gW3X4Da8-140-1165-1198
    • ⏱ 2023-07-08 15:38:40

读书笔记

本书评论