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

Is it more conventional to pass-by-value or pass-by-reference when the method needs ownership of the value?

提问人:Andrew Moffat 提问时间:5/20/2020 最后编辑:ShepmasterAndrew Moffat 更新时间:5/20/2020 访问量:2465

问:

当我通过引用结构的方法传递一个对象时,结构将拥有该对象,是否更常规: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 个引用 传递值

评论

1赞 Stargateur 5/20/2020
如果您需要船主船,请询问船东,如果您不需要,请不要。
0赞 Andrew Moffat 5/20/2020
我认为@Shepmaster把我原来的问题编辑得有点太激进了。我的结构想要副本的所有权,而不是原件的所有权。
1赞 kmdreko 5/20/2020
没有太大区别,如果你需要一个拥有的对象,你应该要求它,调用者可以决定是克隆还是转让所有权
0赞 Shepmaster 5/20/2020
具体来说@AndrewMoffat,你的结构不能知道它是一个副本,因为这只能由结构的创建者决定。

答:

14赞 Shepmaster 5/20/2020 #1

按值传递。

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


在许多情况下,我建议接受任何可以制成自有类型的东西。这很容易通过以下方式证明: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"));
}

另请参阅: