我是移动还是克隆此字符串

Iva*_*adi 2 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
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*odt 7

它被移动了。

在我看来,这是Rust相对于C ++的最大优势之一:如果您看不到.clone()任何地方,那么您就无法克隆了!在Rust中,没有像C ++这样的隐式深层副本。如果要创建副本/克隆,则必须通过调用克隆实例的方法来显式地进行复制。

所有这些都带有一个例外:实现的类型Copy。这些类型使用复制语义而不是移动语义。应该注意的是,Copy只能用于“其值可以简单地通过复制位来复制”的类型,即非常简单的类型。String和其他管理堆内存的类型都没有实现Copy