【问题标题】:Why is the string literal not moved?为什么字符串文字没有移动?
【发布时间】:2018-08-30 07:16:03
【问题描述】:

我正在浏览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:在将其内容附加到 细绳 如果 push_str 方法拥有 s2 的所有权,我们将无法在最后一行打印出它的值。然而,这段代码和我们一样工作 期待!

我正在使用 Rust 1.24.1。

【问题讨论】:

    标签: rust ownership


    【解决方案1】:

    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在被推送后仍然可用。

    【讨论】:

    • 真正重要的部分是&str: Copy,就像所有不可变引用一样。
    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2013-01-12
    • 2011-01-29
    • 2021-12-01
    相关资源
    最近更新 更多