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

Posted

技术标签:

【中文标题】当方法需要值的所有权时,按值传递还是按引用传递更传统?【英文标题】: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 具体来说,您的结构无法知道它是副本,因为这只是结构的创建者可以决定的事情。 【参考方案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"));

另见:

How to accept str, String and &String in a single rust function

【讨论】:

以上是关于当方法需要值的所有权时,按值传递还是按引用传递更传统?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 是按引用传递还是按值传递语言?

参数传递(值传递与引用传递)

JS基础类型和对象,分别是按值传递还是按引用传递?

Ruby 是按值传递还是按引用传递? [复制]

JS是按值传递还是按引用传递

VB 参数传递:按值传递和按地址传递