以下测试程序无法编译:
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
然而,如果你用to_string()
方法处理my_string
,程序就可以编译并工作。to_string()
应该是一个no-op方法,因为my_string
已经是一个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() );
}
铁 rust 理论如何解释这一悖论呢?
1条答案
按热度按时间8ljdwjyq1#
ToString::to_string
方法需要一个&str
,它是Copy
,因此可以在保留所有权的同时将其移出(因为&T: Copy
是T: ?Sized
,请参阅文档)。另一方面,
String
不实现Copy
,这意味着一旦值被移动,它的所有权就被放弃了。