当方法需要值的所有权时,按值传递还是按引用传递更传统?
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【讨论】:
以上是关于当方法需要值的所有权时,按值传递还是按引用传递更传统?的主要内容,如果未能解决你的问题,请参考以下文章