为什么这种所有权转移不会导致错误?
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
所以对象并没有真正移动。
我正在研究所有权部分。 我写了以下代码预期会出错。
问题:为什么第一次编译版本没有报错?
本次编译:
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
所以对象并没有真正移动。