rust - 为什么在 String 上调用 .to_string() 可以避免移动错误?不是空投吗?

标签 rust borrow

下面的测试程序不会编译:

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/

相关文章:

loops - rust借阅检查看起来很聪明,它可以检查和平整循环的读写。但是我该如何绕过呢?

rust - 是否可以在 stdin.lines() 中间执行另一次读取?

enums - 如何有条件地检查枚举是一种变体还是另一种变体?

Rust nightly vs beta 版本

rust - 方法存在,但不满足以下特征范围(泛型)

rust - 如何返回使用局部声明变量的结构实例

rust - 如何创建动态创建值并将借用归还给它们的工厂?

rust - Rust,在闭包内创建一个闭包,避免 “closure may outlive the current function”