rust字符串

1、Rust 字符串相加第二个参数为什么要是&str?

    let s = String::from("Hello ");
    let v = String::from("Rust");
    let _s2 = s + &v;

Rust 字符串相加第二个参数为什么要是&str

(1)为什么是借用?

如果不借用的话,第二个参数就会被移动,完成字符串拼接之后,v 就不可用。但这很不实用,因为字符串拼接不可避免要复制 v 的内容,没必要移动 + 复制,直接借用 + 复制,这样后面还能继续用 v。

那为什么第一个参数不是借用呢?主要是为了性能优化,重用底层的数组,减少复制,把多个字符串串拼接的复杂度从 O(n^2) 优化到 O(n) ,原理类似 Java 的 StringBuilder。

(2)为什么是 &str 而不是 &String?

这是一个常用的模式: Use borrowed types for arguments

Using a target of a deref coercion can increase the flexibility of your code when you are deciding which argument type to use for a function argument. In this way, the function will accept more input types.

当您决定使用哪个参数类型作为函数参数时,使用deref强制转换的目标可以增加代码的灵活性。通过这种方式,函数将接受更多的输入类型。

This is not limited to slice-able or fat pointer types. In fact you should always prefer using the borrowed type over borrowing the owned type. E.g., &str over &String, &[T] over &Vec, or &T over &Box.

这并不局限于可切片或胖指针类型。事实上,您应该始终更喜欢使用借来的类型而不是借用拥有的类型。例如&str 优于 & String, &[T] 优于 & Vec ,或&T > &Box

Using borrowed types you can avoid layers of indirection for those instances where the owned type already provides a layer of indirection. For instance, a String has a layer of indirection, so a &String will have two layers of indrection. We can avoid this by using &str instead, and letting &String coerce to a &str whenever the function is invoked.

使用借用类型可以避免那些拥有类型已经提供了一层间接层的实例的间接层。例如,一个String有一个间接层,所以&String将有两个间接层。我们可以通过使用&str来避免这种情况,并让&String在函数被调用时强制转换为&str。

coercion
n. 强制;强迫;高压政治;威压

indirection
n. 间接;迂回;不坦率

主要是为了减少一层指针。(String 实现 Deref<Target=str>,所以在函数需要 &str 参数的时候,&String 自动强转换成 &str)


   转载规则


《rust字符串》 bill 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
ubuntu18.04软RAID0方法 ubuntu18.04软RAID0方法
n代表硬盘总数 JBOD(Just a Bunch Of Disks)指将数个物理硬盘, 在操作系统中合并成⼀个逻辑硬盘, 以直接增加容量 依不同RAID⼚商实现算法对于性能表现会有不同, 性能公式仅供参考 RAID10、5
2020-03-11
下一篇 
mac上必装的软件 mac上必装的软件
软件 Maczip:压缩软件 Typora:md文档软件 V2rayU:翻墙软件 VSCode:编辑器 Microsoft Remote Desktop:远程连接 Royal TSX:堪比xshell的远程工具 Mac上类似于xshell的
2020-03-11
  目录