当该方法需要值的所有权时,按值传递还是按引用传递是更常规的?

问题描述 投票:1回答:1

[当我通过引用结构的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());
}
rust reference pass-by-reference pass-by-value
1个回答
2
投票

按值传递。

这样,如果调用者不再需要该值,程序可以避免不必要地重复分配该值。


[在许多情况下,我建议接受可以使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"));
}

另请参见:

© www.soinside.com 2019 - 2024. All rights reserved.