rust - 我是在移动还是克隆这个字符串

标签 rust

我有一个这样定义的枚举:

#[derive(Clone, Debug)]
pub enum JsonState {
    NameReadingState(String),
    StringState(String),
}

impl JsonState {
    pub fn get_name_read(self) -> String {
        if let JsonState::NameReadingState(name) = self {
            return name;
        } else {
            panic!(
                "Error: attempted to get name from non name state {:#?}",
                self
            );
        }
    }
}

如果我要在 JsonState 的实例上调用 get_name_read,字符串会被移出枚举还是会被复制?我的理解是,由于我传递的是 self 而不是 &self 我正在获取函数内部实例的所有权,因此我应该能够简单地将字符串移出它.

最佳答案

它被感动了。

在我看来,这是 Rust 相对于 C++ 的一大优势:如果你在任何地方都看不到 .clone(),那么你就没有克隆!在 Rust 中,没有像 C++ 中那样的隐式深拷贝。如果你想创建一个副本/克隆,那么你必须通过调用一个克隆你的实例的方法来明确地做到这一点。

所有这些都有一个异常(exception):实现 Copy 的类型.这些类型使用复制语义而不是移动语义。需要注意的是,Copy 只能对“其值可以简单地通过复制位进行复制”的类型实现,即非常简单的类型。 String 和任何其他管理堆内存的类型都没有实现 Copy

关于rust - 我是在移动还是克隆这个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57553740/

相关文章:

rust - 从 Mutex 中同时借用引用和保护

rust - 有没有办法在 proc-macro crate 中具有公共(public)特征?

rust - 如何在 Rust 中将字符串转换为二进制字符串?

rust - 如何拥有一个接受来自另一个变量的闭包调用方法的结构?

rust - 异步函数 : the trait `std::marker::Send` is not implemented for `std::sync::MutexGuard<' _, 客户端>`

rust - 如何使用 serde_json 从 JSON 数组内部流式传输元素?

rust - 使用方法调用结果时的多个可变借用

rust - 从 char 获取字节序列 (u8)

rust - 我如何使用 include_str!对于多个文件或整个目录?

rust - 如何漂亮地打印 Syn AST?