为什么 Rust 不允许使用这种语法:
当我尝试编译这段代码时,我得到了:
fn main() {
let a = String::from("ping");
let b = a;
println!("{{{}, {}}}", a, b);
}
当我尝试编译这段代码时,我得到了:
事实上,我们可以简单地创建一个引用 - 运行时并不相同。error[E0382]: use of moved value: `a` --> src/main.rs:5:28 | 3 | let b = a; | - value moved here 4 | 5 | println!("{{{}, {}}}", a, b); | ^ value used here after move | = note: move occurs because `a` has type `std::string::String`, which does not implement the `Copy` trait
fn main() {
let a = String::from("ping");
let b = &a;
println!("{{{}, {}}}", a, b);
}
它有效:
根据Rust Book的说明,这是为了避免双重释放错误,因为Rust的变量是按引用而不是按值复制的。Rust将简单地使第一个对象无效并使其无法使用...{ping, ping}
我们必须做类似这样的事情:
我喜欢通过引用复制的想法,但为什么会自动使第一个失效呢?
可以使用不同的方法避免双重释放。例如,C++已经有了一个很好的工具来允许多个free调用...shared_ptr
只在没有其他指针指向对象时才调用free - 这似乎与我们实际正在做的非常相似,不同之处在于shared_ptr
有一个计数器。
例如,我们可以在编译时计算每个对象的引用数量,并仅在最后一个引用超出范围时调用free
。
但Rust是一种年轻的语言;也许他们还没有时间去实现类似的东西?Rust是否计划允许对对象进行第二次引用而不使第一个失效,还是应该习惯于仅使用引用的引用?