以下测试程序无法编译:
fn f1( string: String) {
println!("{}", string );
}
fn f2( string: String) {
println!("{}", string );
}
fn main() {
let my_string: String = "ABCDE".to_string();
f1( my_string );
f2( my_string );
}
它会生成预期的错误:
11 | f1( my_string );
| --------- value moved here
12 | f2( my_string );
| ^^^^^^^^^ value used here after move
然而,如果你治疗my_string
与to_string()
方法,程序编译并运行。to_string()
应该是一个无操作方法,因为my_string
is a String
已经。然而,这个程序运行良好。
fn f1( string: String) {
println!("{}", string );
}
fn f2( string: String) {
println!("{}", string );
}
fn main() {
let my_string: String = "ABCDE".to_string();
f1( my_string.to_string() );
f2( my_string.to_string() );
}
锈理论如何解释这个悖论?
The ToString::to_string https://doc.rust-lang.org/std/string/trait.ToString.html#tymethod.to_string方法需要一个&str
,即Copy
,因此可以在保留所有权的同时将其移出(因为&T: Copy
for T: ?Sized
, see 文档 https://doc.rust-lang.org/std/primitive.reference.html#trait-implementations-1).
另一方面,String
不实施Copy
,这意味着一旦价值被转移,它的所有权就被放弃了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)