我正在学习 Rust 参考,我想知道这个drop()功能。在此示例中是&Box<i32>对堆栈或堆上某些内容的引用。
let y = 32; // `y` lives on the stack
drop(y); // why doesn't this complain
println!("{}", y); // this also doesn't complain
Run Code Online (Sandbox Code Playgroud)
drop不是一个特殊的函数。它所做的只是获取传入值的所有权,然后在函数返回时将其销毁。文档甚至这样说:
这个功能并不神奇;它的字面定义是
Run Code Online (Sandbox Code Playgroud)pub fn drop<T>(_x: T) { }因为
_x被移入函数中,所以在函数返回之前它会被自动删除。
如果您有一个需要 的函数怎么办i32?
fn example(_v: i32) { }
Run Code Online (Sandbox Code Playgroud)
当您调用此方法时,i32您提供的值将被复制,因为i32实现了该Copy特征。这允许您稍后再次使用提供的值。
所做的一切Copy都是为了当尝试移动实现值时,改为执行按位复制,从而使源值可用。
现在应该更清楚为什么这不会引起问题了。中的值y被复制到_x的参数中drop()。由于它是复制的而不是移动的,y因此仍然可以使用。
如果您更改代码以便y保存未实现的类型的值Copy,您将看到如您所料的编译时错误。