为什么当你删除堆栈中的值时 Rust 不会抱怨

MrB*_*197 4 rust

我正在学习 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)

cdh*_*wie 7

drop不是一个特殊的函数。它所做的只是获取传入值的所有权,然后在函数返回时将其销毁。文档甚至这样说:

这个功能并不神奇;它的字面定义是

pub fn drop<T>(_x: T) { }
Run Code Online (Sandbox Code Playgroud)

因为_x被移入函数中,所以在函数返回之前它会被自动删除。

如果您有一个需要 的函数怎么办i32

fn example(_v: i32) { }
Run Code Online (Sandbox Code Playgroud)

当您调用此方法时,i32您提供的值将被复制,因为i32实现了该Copy特征。这允许您稍后再次使用提供的值。

所做的一切Copy都是为了当尝试移动实现值时,改为执行按位复制,从而使源值可用。

现在应该更清楚为什么这不会引起问题了。中的值y被复制到_x的参数中drop()。由于它是复制的而不是移动的,y因此仍然可以使用。

如果您更改代码以便y保存未实现的类型的值Copy,您将看到如您所料的编译时错误。