假设我有
Option
为 Rc
:
let x = Some(Rc::new(3));
如果我需要克隆,我可以这样做:
let y = Some(Rc::clone(&x.unwrap()));
但似乎还有捷径:
let y = x.clone();
这些选项有什么区别吗?或者他们内部也在做同样的事情?
有一个通用实现
impl<T: Clone> Clone for Option<T> {
#[inline]
fn clone(&self) -> Self {
match self {
Some(x) => Some(x.clone()),
None => None,
}
}
// ...
}
因此,如果
x
是 Option<Rc<T>>
,则 x.clone()
将简单地遵循 Clone
上的 Rc<T>
实现。
这些选项有什么区别吗?
当
x
为 None
时有区别。
使用
let y = Some(Rc::clone(&x.unwrap()));
它将出现恐慌,而使用 let y = x.clone();
则会将 None
分配给 y
。
当
x
是 Some
时,确实没有区别。
因此,除非您明确希望它在
x
为 None
时出现恐慌,否则建议使用第二个选项,这样更简洁。