以下测试程序无法编译:
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 );
}
Run Code Online (Sandbox Code Playgroud)
它会生成预期的错误:
11 | f1( my_string );
| --------- value moved here
12 | f2( my_string );
| ^^^^^^^^^ value used here after move
Run Code Online (Sandbox Code Playgroud)
但是,如果您使用my_string该to_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() );
}
Run Code Online (Sandbox Code Playgroud)
锈理论如何解释这个悖论?
该ToString::to_string方法需要 a &str,即Copy,因此可以在保留所有权的同时将其移出(因为&T: Copy对于T: ?Sized,请参阅文档)。
另一方面,String不实现Copy,这意味着一旦价值被移动,它的所有权就被放弃了。
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |