【发布时间】:2020-11-13 00:32:10
【问题描述】:
在编写函数时,如何决定是引用输入参数还是使用输入参数?
例如,我应该这样做吗?
fn foo(val: Bar) -> bool { check(val) } // version 1
或者改用引用的参数?
fn foo(val: &Bar) -> bool { check(*val) } // version 2
在客户端,如果我只有第二个版本,但想要消费我的价值,我必须这样做:
// given in: Bar
let out = foo(&in); // using version 2 but wanting to consume ownership
drop(in);
另一方面,如果我只有第一个版本但想保留我的参考,我必须做这样的事情:
// given in: &Bar
let out = foo(in.clone()); // using version 1 but wanting to keep reference alive
那么哪个是首选,为什么?
在做出此选择时是否有任何性能方面的考虑?或者编译器是否使它们在性能方面等效,以及如何使它们等效?
你想什么时候提供两个版本(通过特征)?在那些时候,你如何为这两个函数编写底层实现——你是在每个方法签名中复制逻辑还是有一个代理到另一个?哪个到哪个,为什么?
【问题讨论】:
-
我刚刚发现的另一个有用的相关答案——可能对其他人有用:stackoverflow.com/questions/63465672/…