在编写函数时,如何决定使输入参数成为引用参数还是传值参数?
例如,我应该这样做吗?
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
那么,哪种方法更好,为什么?
在做出这个选择时是否有性能方面的考虑?或者编译器会如何使它们在性能上等效?
如果您想通过特征提供两个版本,什么情况下需要这样做?对于这些情况,您如何编写两个函数的基础实现 - 在每个方法签名中重复逻辑还是有一个代理到另一个?哪个代理到哪个,为什么?