[当我通过引用结构的new()
方法传递对象,而该结构将拥有该对象时,是否更常规:
to_owned()
中执行new()
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());
}
按值传递。
这样,如果调用者不再需要该值,程序可以避免不必要地重复分配该值。
[在许多情况下,我建议接受可以使into成为拥有类型的任何内容。这很容易通过String
进行演示:
struct MyStruct {
state: String,
}
impl MyStruct {
fn new(state: impl Into<String>) -> Self {
let state = state.into();
MyStruct { state }
}
}
fn main() {
let struct1 = MyStruct::new("foo");
let struct2 = MyStruct::new(String::from("bar"));
}
另请参见: