【问题标题】:Is it available to drop a variable holding a primitive value in Rust?是否可以在 Rust 中删除包含原始值的变量?
【发布时间】:2021-07-18 05:14:11
【问题描述】:

更新问题:

或者我可以这样问:对于每个类型T,如果它是Copy,那么它就无法移动,对吧?我的意思是有没有像 C++ 中的 std::move 这样的方法可以显式移动可复制值?


原问题:

假设我们有一段 Rust 代码,在这段代码中,我定义了一个变量 x 持有 i32 值。我想要做的是降低它的价值并使其无效。我尝试使用ptr::drop_in_place 通过指针将其删除,但它不起作用,为什么?

fn main() {
    let mut x = 10;
    use std::ptr;
    unsafe {
        ptr::drop_in_place(&mut x as *mut i32);
    }
    println!("{}", x);  // x is still accessible here.
}

【问题讨论】:

  • 我不确定您所做的是否安全,但我也不确定您想要实现什么。 i32 没有任何 drop behavior
  • 那么,对于每一个类型的T来说,如果它是Copy,那么它就没有办法被移动了,对吧?

标签: rust


【解决方案1】:

对于T的每一个类型,如果是Copy,那它就没法移动了,对吧?

这是一种表达方式。 Copy 的语义使得任何 move 都会使原始对象保持有效。

因为这个和那个Drop and Copy are mutually exclusive traits,没有办法“删除”Copy。调用std::mem::drop(x) 的传统方法不起作用。你能做的唯一有意义的事情就是让变量超出范围:

fn main() {
    {
        let x = 10;
    }
    println!("{}", x);  // x is no longer accessible here.
}

我的意思是有没有像 C++ 中的 std::move 这样的方法可以显式移动可复制值?

复制与移动的细节在 C++ 和 Rust 之间是完全不同的。 所有 类型在 Rust 中都是可移动的,而它在 C++ 中是可选的。在 Rust 中移动和复制总是按位复制,没有自定义代码的空间。移入 Rust 会使源对象无效,而它在 C++ 中仍可用作值。

我可以继续说下去,但我会留下最后一点:移动 C++ 中的原语也与副本没有什么不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2013-11-05
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多