【发布时间】:2020-09-05 23:31:56
【问题描述】:
当我通过引用结构的new() 方法来传递对象时,结构将拥有该对象,是否更传统:
- 通过引用传递对象,并在
new()中执行to_owned() - 在调用
new()之前克隆对象,并通过值传递,移动它
我可以从清晰度和关注点分离的角度考虑每种方法的优缺点。
#[derive(Clone)]
struct MyState;
struct MyStruct {
state: MyState,
}
impl MyStruct {
pub fn new_by_ref(state: &MyState) -> Self {
MyStruct {
state: state.to_owned(),
}
}
pub fn new_by_val(state: MyState) -> Self {
MyStruct { state }
}
}
fn main() {
let state1 = MyState;
let struct1 = MyStruct::new_by_ref(&state1);
let state2 = MyState;
let struct2 = MyStruct::new_by_val(state2.clone());
}
【问题讨论】:
-
如果您需要船东,请询问船东,如果不需要,请不要。
-
@Shepmaster 我认为编辑我的原始问题有点过于激进。我的结构想要副本的所有权,而不是原件的所有权。
-
没有太大区别,如果你需要一个拥有的对象你应该要求它,调用者可以决定是克隆还是转移所有权
-
@AndrewMoffat 具体来说,您的结构无法知道它是副本,因为这只是结构的创建者可以决定的事情。
标签: rust reference pass-by-reference pass-by-value