下面的测试程序不会编译:
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()
应该是一个无操作方法,因为 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 理论如何解释这个悖论?
最佳答案
ToString::to_string
方法需要一个&str
,即Copy
,因此它可以在保留所有权的情况下被移出(因为&T: Copy
for T: ?大小
,请参阅 the documentation )。
另一方面,String
没有实现Copy
,这意味着一旦值被移动,它的所有权就被放弃了。
关于rust - 为什么在 String 上调用 .to_string() 可以避免移动错误?不是空投吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74814674/