Rust 重载引用和值调用

Rust 重载引用和值调用,rust,overloading,Rust,Overloading,我有三个带有签名的函数,如下所示(下面稍微简化): 它会根据参数类型选择正确的重载?如果您的函数可以在不使用x的情况下工作,为什么需要多个版本?!?使用x的版本可以跳过完整副本,因为我们可以对x进行变异。我简化了它们实际返回的函数(相同的值)。它们大致上类似于Option.map。如果需要使用值,只需按值获取,并让调用方在需要时执行复制。实际上,在这两种情况下都没有复制,只是一个创建一个新对象,另一个修改到位。但情况并非总是如此,它取决于第二个参数的确切类型,因为这是一个特性,因此实现可能会有所

我有三个带有签名的函数,如下所示(下面稍微简化):


它会根据参数类型选择正确的重载?

如果您的函数可以在不使用
x
的情况下工作,为什么需要多个版本?!?使用
x
的版本可以跳过完整副本,因为我们可以对
x
进行变异。我简化了它们实际返回的函数(相同的值)。它们大致上类似于
Option.map
。如果需要使用值,只需按值获取,并让调用方在需要时执行复制。实际上,在这两种情况下都没有复制,只是一个创建一个新对象,另一个修改到位。但情况并非总是如此,它取决于第二个参数的确切类型,因为这是一个特性,因此实现可能会有所不同。您可以从我对类似问题的回答中学习:如果您的函数可以在不使用
x
的情况下工作,为什么需要多个版本?!?使用
x
的版本可以跳过完整副本,因为我们可以对
x
进行变异。我简化了它们实际返回的函数(相同的值)。它们大致上类似于
Option.map
。如果需要使用值,只需按值获取,并让调用方在需要时执行复制。实际上,在这两种情况下都没有复制,只是一个创建一个新对象,另一个修改到位。但情况并非总是如此,这取决于第二个参数的确切类型,因为这是一个特性,所以实现可能会有所不同。您可以从我对类似问题的回答中学习:
fn f<T>(f: impl Fn(&T), x : &impl ATrait<T>) {}
fn f<T>(f: impl Fn(&T), x : impl ATrait<T>) {}
fn f<T>(f: impl Fn(T), x : impl ATrait<T>) {}
f(|&e| {}, &x);
f(|&e| {}, x);
f(|e| {}, x);