rust 为什么在String上调用.to_string()可以避免移动错误?这不是一个空操作吗?

r3i60tvu  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(114)

以下测试程序无法编译:

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 理论如何解释这一悖论呢?

8ljdwjyq

8ljdwjyq1#

ToString::to_string方法需要一个&str,它是Copy,因此可以在保留所有权的同时将其移出(因为&T: CopyT: ?Sized,请参阅文档)。
另一方面,String不实现Copy,这意味着一旦值被移动,它的所有权就被放弃了。

相关问题