为什么这种所有权转移不会导致错误?

Why does this Ownership transfer does not cause an error?

我正在研究所有权部分。 我写了以下代码预期会出错。

问题:为什么第一次编译版本没有报错?

本次编译:

fn main () {

let mut x = String::from("vier");
let mut y = x.to_owned()+"1"; //here x should go out of scope, because used in a method
let mut z = x.to_owned()+"2";

x.push_str("test");


println!("{}", x);
println!("{}", y);
println!("{}", z);
 }

这个不编译:

fn main () {

let mut x = String::from("vier");
let mut y = x;//x out of scope
let mut z = x;//x out of scope

x.push_str("test");


println!("{}", x);
println!("{}", y);
println!("{}", z);
 }

to_owned() only takes a reference,不是所有权。您会注意到 T 的全面实施需要 T: Clone:

impl<T> ToOwned for T where
    T: Clone, 
type Owned = T

表示 .to_owned() 对任何实现 Clone 的类型使用 .clone()

to_owned 是来自 borrow::ToOwned 特征的方法。其中 returns 元素的拥有版本 (cloned/copy)。它只需要一个 &self 所以对象并没有真正移动。