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

发布于 2022-09-12 13:53:54 字数 182 浏览 29 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

漆黑的白昼 2022-09-19 13:53:54
为什么是借用

如果不借用的话,第二个参数就会被移动,完成字符串拼接之后,v 就不可用。

但这很不实用,因为字符串拼接不可避免要复制 v 的内容,没必要移动 + 复制,直接借用 + 复制,这样后面还能继续用 v。

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

为什么是 &str 而不是 &String

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

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 实现 Deref<Target=str>,所以在函数需要 &str 参数的时候,&String 自动强转换成 &str)

青衫负雪 2022-09-19 13:53:54

rust 没有原生的字符串类型,只有字符类型。字符串被视为一种复合类型,&v 实质是一个字符串切片

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文