我正在浏览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。
答案 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
在推送后仍然可用。