【问题标题】:Is it more conventional to pass-by-value or pass-by-reference when the method needs ownership of the value?当方法需要值的所有权时,按值传递还是按引用传递更传统?
【发布时间】:2020-09-05 23:31:56
【问题描述】:

当我通过引用结构的new() 方法来传递对象时,结构将拥有该对象,是否更传统:

  • 通过引用传递对象,并在new()中执行to_owned()
  • 在调用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());
}

【问题讨论】:

  • 如果您需要船东,请询问船东,如果不需要,请不要。
  • @Shepmaster 我认为编辑我的原始问题有点过于激进。我的结构想要副本的所有权,而不是原件的所有权。
  • 没有太大区别,如果你需要一个拥有的对象你应该要求它,调用者可以决定是克隆还是转移所有权
  • @AndrewMoffat 具体来说,您的结构无法知道它是副本,因为这只是结构的创建者可以决定的事情。

标签: rust reference pass-by-reference pass-by-value


【解决方案1】:

按值传递。

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


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

另见:

【讨论】:

    猜你喜欢
    • 2019-04-04
    • 2011-04-20
    • 1970-01-01
    • 2016-11-28
    • 2017-11-14
    相关资源
    最近更新 更多