似乎有两种不进行动态分派的将函数作为参数传递的方法:
&impl Fn(TIn) -> TOut // 通过引用
impl Fn(TIn) -> TOut // 通过值
假设函数是纯函数(即可被多次调用),我的初步想法是最好通过引用来传递。这意味着函数对象可以被多次使用(因为没有转移所有权),在更常见的情况下,即匿名闭包的情况下,引用间接性应该被优化掉,因为编译器准确地知道函数本身(所以它可以被内联)。
但是,我注意到例如 Option::map
就会通过值传递其闭包,这让我想可能我做错了什么。
我应该通过值还是通过引用传递函数对象?如果没有明显的答案,那我应该考虑哪些因素?
&f
。 - BubletanFn
是可复制的,但在我看来,通过引用传递始终有效。如果你指出选项1的缺点,我可能会理解为什么选项2是更好的方法。 - Clinton&f
而不是只写f
。如果你有实现了Fn的&F,你仍然可以像原来一样直接传递它。 - Bubletan