为什么字符串文字没有移动?

时间:2018-03-21 08:50:14

标签: rust ownership

我正在浏览Rust second edition ebook并在链接章节的一段代码中,如果我删除第3行中的引用运算符(&),程序仍然可以正常工作。

let mut s1 = String::from("foo");
let s2 = "bar";
s1.push_str(&s2); // here
println!("s2 is {}", s2);

应根据本书移动s2的值。但是,如果我改变

s1.push_str(&s2);

s1.push_str(s2);

以下行应该触发错误,但它不会发生:

println!("s2 is {}", s2);

文档中的一个片段:

  

清单8-16:在将内容附加到a后使用字符串切片   串   如果push_str方法取得s2的所有权,我们将无法在最后一行打印出它的值。但是,这段代码可以像我们一样工作   期待!

我正在使用Rust 1.24.1。

1 个答案:

答案 0 :(得分:4)

push_str的签名是:

pub fn push_str(&mut self, string: &str)

这意味着它的参数是一个参考。这匹配s2的类型,它是对静态字符串切片的引用:

let s2: &'static str = "bar";

编译器可以根据需要取消引用push_str的参数,因此s1.push_str(s2)s1.push_str(&&&&&s2)一样有效。

因为最后你总是传递一个引用,所以不会移动参数(只是借用),并且s2在推送​​后仍然可用。

相关问题