web-dev-qa-db-ja.com

メソッドが値の所有権を必要とする場合、値渡しまたは参照渡しの方が一般的ですか?

構造体の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());
}
13
Andrew Moffat

値渡し。

このようにして、プログラムは、呼び出し側が値を必要としなくなった場合に、値を不必要に二重に割り当てることを回避できます。


多くの場合、作成できるものは何でも受け入れることをお勧めします 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"));
}

以下も参照してください。

13
Shepmaster