構造体の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"));
}
以下も参照してください。