我有一个这样定义的枚举:
#[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/