“Rust设计模式,惯常做法1:编码时应该总是倾向于使用借用类型而不是借用所有类型。”
01
—
通常做法
编码时应该总是倾向于使用借用类型而不是借用所有类型。
例如:对于String类型来说,应该倾向于使用使用&str,而不是&String;对于T类型来说,应该倾向于 使用&[T]而不是&Vec[T];应该倾向于使用&T而不是&Box。
02
—
为什么要这样做
原因1
在《Rust设计模式》书中,提出“使用借用类型可以避免已经提供一层间接性的所有类型上的多层间接“。我们考虑下面几行代码:
其在内存中如下:
那么结合上面的图,我们可以有如下理解:
String类型具有一层间接,因为String类型的本质是一个具有三个字段的胖指针(三个字段分别是ptr、cap、len,ptr指向在堆上的具体的内容);
&String具有两层引用,是因为是String的基础上,加了&,所以b实际上指向的是a,而不是堆上的内容;
&str类型也是一个胖指针,直接指向栈上的内容。
所以对比&String和&str,显然使用&str的效率更高。
因此,从这个层面来说,这条规则也可以换种说法:应该倾向于使用间接层面更少的方式。
原因2
我们再考虑下面的例子:
从上面的例子,我们可以看出,在有些情况下,我们在函数中并不需要拥有变量的所有权(如print_use_string和print_use_str功能一样),所以传引用即可,而传&str比传&String效率更高。
所以,在这个层面,我们也应该更倾向于使用借用类型而不是借用所有类型。
参考文档:
https://rust-unofficial.github.io/patterns/idioms/coercion-arguments.html
领取专属 10元无门槛券
私享最新 技术干货