Rust中文翻译23

4.9 Borrow 和 AsRef

Borrow和AsRef特性特性很相似,但是不一样.这里有一个快速的关于两者的回顾.

4.9.1 Borrow

Borrow特性是当你写了一个数据结构,然后你想让一个它的所有者或者借用者类型作为同义词对象来使用.

例如,HashMap就有一个get方法使用了Borrow:

fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>

where K: Borrow<Q>,

Q: Hash + Eq

这个签名非常复杂.K参数是我们感兴趣的点.它代表着一个HashMap的参数:

struct HashMap<K, V, S = RandomState> {

K参数就是HashMap使用的key.所以,再看一下get()的签名,我们可以试用get()函数,当key实现了Borrow<Q>时.那样,我们可以生成一个使用String作为key的hashMap,但是当我们搜索的时候使用&str.

use std::collections::HashMap;

let mut map = HashMap::new();

map.insert("Foo".to_string(), 42);

assert_eq!(map.get("Foo"), Some(&42));

这是因为标准库为String类型实现了impl Borrow<str>.

对大部分类型来说,当你需要一个拥有的或借用的类型时,一个&T就足够了.而Borrow高效的地方在于当有多个借用的值发生时.切片就是其中一种场景:你可以获得一个&[T]或者&mut [T].如果我们希望同时获得这两个类型:

use std::borrow::Borrow;

use std::fmt::Display;

fn foo<T: Borrow<i32> + Display>(a: T) {

println!("a is borrowed: {}", a);

}

let mut i = 5;

foo(&i);

foo(&mut i);

输出是俩个:a is borrowed: 5

4.9.2 AsRef

AsRef是一个习惯特性.它用于在泛型代码中将值转换为引用.像这样:

let s = "Hello".to_string();

fn foo<T: AdRef<str>>(s: T) {

let slice = s.as_rf();

}

4.9.3 我该用那个?

我们可以看到他们很像:他们都可以处理所有的或借用的类型.但是有一点不同.

当你需要抽象不同类型的借用时,使用Borrow,或者你要创建一个数据结构用相同的方法来处理所有的或借用的值,例如hashing和比较.

当你需要把值直接转化为引用的时候,使用AsRef,并且你在写泛型代码.

4.10 发布渠道

Rust工程使用一个概念叫"发布渠道"来管理它的发布.当你选择使用哪种版本的Rust的时候,理解它就很重要.

4.10.1 概览

有三种发布渠道:

nightly

beta

stable

每夜发布板每天都会生成.每6周,最后一个每夜发布板升级为beta版.那时,它将只收到patch来解决严重问题.6周之后,beta版升级为稳定版,然后变成下一个1.x版本.

这个过程是并行的.所以每过6周,在同一天,都会有nightly,beta,stable发布.当1.x发布后,同时,1.(x+1)-beta发布,nightly也会变成1.(x+2)-nightly.

4.10.2 选择一个版本

总的来说,除非你是特别的原因,你应该选择stable版本.这个版本适用于广大受众.

然而,你可以选择使用nightly版本,取决于你对Rust的感兴趣程度.代价是这样的:nightly版本中,你可以使用不稳定的,新的Rust特性.然而,不稳定的特性也会改变,所以任何新的nightly版本都可能是你的代码崩溃.如果你使用stable版本,你不能体验实验性的特性,但是下一个stable版本发布的时候不会对你的代码造成严重影响.

4.10.3 使用CI来帮助构建Rust生态系统

那么beta版本呢?我们鼓励所有的Rust程序员使用stable版本的同时也测试一下beta版本.在他们持续的系统环境中使用beta版.这会帮助我们的团队,提出预警,以免发生意外的倒退.

另外,测试nightly版本可以更快的捕获倒退,如果你不介意编译3次,你可以测试所有的版本.

时间: 2024-10-09 21:54:31

Rust中文翻译23的相关文章

Rust中文翻译7

去台湾玩儿了一个礼拜,赶紧回来继续翻译吧! 3.1.5 循环 Page 38 loop关键字可以实现一个无限循环.让我们来加入一个循环: extern crate rand; use std::io; use std::cmp::Ordering; use rand::Rng; fn main() { println!("Guess the number!"); let secret_number = rand::thread_rng().gen_range(1, 101); prin

Rust中文翻译29

5.10 生命期 本节是Rust三处描述所有权系统的其中之一.所有权是Rust最独特和引人注目的特性,这也是Rust程序员必须熟悉的一个特性.所有权使Rust得以实现它最大的设计目标,内存安全.这里有一些不同的概念,每一个都有自己的章节: 所有权,你正在读的 借用(borrowing, 5.9), 以及它的关联特性'引用' 生命期(5.10),以及borrowing的高级特性 这三者是相关的,也是循序渐进的.你必须要完全理解这个三个部分. 5.10.1 元 在我们讨论细节之前,有两个关于所有权系

Rust中文翻译21

4.7 错误处理 有时候程序会发生错误.对于不可避免的事情发生时最好有一个计划来处理.Rust有丰富的处理错误的方法. 你的程序会出现两种类型的错误:失败和崩溃.我们先讨论两者的区别,然后讨论如何处理他们.然后,我们讨论把错误升级为崩溃. Page 107 4.7.1 失败和崩溃 Rust使用两种错误的类型:失败和崩溃.失败是一种可以被挽回的错误.崩溃却不行. "挽回"是什么意思呢?在多数情况下,很有可能会发生错误.例如,一个parse函数: "5".parse()

Rust中文翻译12

Page 63 我们已经学习了如何写一些Rust代码了.但是能写Rust代码和能写好的Rust代码又很大区别. 这一章讲述一些相对独立的指南,告诉你如何把的Rust代码更进一步.一些常用的模式和标准库会被提到.你可以随意安排阅读本章的顺序. 4.1 栈和堆 作为一个系统级别的语言,Rust可以在底层进行操作.如果你来自于高层语言,有一些系统编程概念你可能不太熟悉.最重要的就是内存中的栈和堆是如何工作的.如果你了解类C语言中栈的分配,这一章就是一个回顾.如果你不了解,你可以在本章学习这些概念了,但

Rust中文翻译28

5.9 引用和借用 本节是Rust三处描述所有权系统的其中之一.所有权是Rust最独特和引人注目的特性,这也是Rust程序员必须熟悉的一个特性.所有权使Rust得以实现它最大的设计目标,内存安全.这里有一些不同的概念,每一个都有自己的章节: 所有权,你正在读的 借用(borrowing, 5.9), 以及它的关联特性'引用' 生命期(5.10),以及borrowing的高级特性 这三者是相关的,也是循序渐进的.你必须要完全理解这个三个部分. 5.9.1 元 在我们讨论细节之前,有两个关于所有权系

Rust中文翻译17

4.2.4 文档测试 没有什么比带有示例的文档更好的了.也没有什么比不能工作的例子更糟的了,因为有可能文档中的代码已经修改了.为此,Rust支持自动测试我们示例代码.让我们看一个富有血肉的src/lib.rs的例子: //! The àdder` crate provides functions that add numbers to other numbers. //! //! # Examples //! //! ``` //! assert_eq!(4, adder::add_two(2)

Rust中文翻译15

大多数使用垃圾回收的语言都默认在堆上分配内存.这就意味着每个值都要装箱.有很多原因导致他们这样设计,但是这超出了本书的范围.同样,也有很多优化设计导致它并不是100%这样工作的.垃圾回收器宁愿选择在堆上分配内存,也不使用栈和Drop操作来释放内存. 4.1.7 该用哪一种呢? 所以当栈又快又好用的时候,为什么我们还需要使用堆呢?一个重要的原因是,栈只给你提供了LIFO语义来管理内存.堆分配却可以提供更加通用的和任意的顺序来使用内存,同时附带一些开销. 通常情况下,你应当使用栈,Rust默认就是如

Rust中文翻译20

Page 100 并发和并行在计算机科学中是非常重要的主题.在工业领域也很火.计算机如今有越来越多的核心,然而很多程序员还没有准备好使用它们. Rust安全的内存特性同样适用于并发存储.并发的Rust代码也是内存安全的,没有数据竞争.Rust的类型系统会保证这一点,给你提供了有利的帮助在编译时实现并发代码. 在我们开始讨论Rust的并发之前,我们需要理解一个很重要的事情:Rust是一个低级别语言,它的所有功能都是通过库来提供的,而不是语言自身.也就是说你不喜欢Rust处理并发的方式,你完全可以实

Rust中文翻译34

5.14 Match 经常,一个简单的if/else还不够,因为你可能会有多于两种情况.而且,条件会变得更加复杂.Rust有一个关键字,match,允许你替代复杂的if/else组合,来实现一些更强大的功能.看一下: let x = 5; match x { 1 => println!("one"), 2 => println!("two"), 3 => println!("three"), 4 => println!(&