用于 map() 的函数应该引用吗?

Should functions used for map() take a reference?

只是想为 x 的列表编写一个通用的 take_samples() 函数。

type Real = f32;
type FunctionRR = fn(Real) -> Real;
type ListOfReal = Vec<Real>;

fn take_samples( xs: &ListOfReal, f: FunctionRR ) -> ListOfReal {
    return xs.iter().map( f ).collect();
} 

let ys = take_samples( &xs, |x| x*x );

但出现错误:

map expected fn( &f32 ) -> _ but found fn ( f32 ) -> _

另外,fn是一个指向函数的指针。因此,如果我没记错的话,take_samples() 只允许使用函数。 一般的解决方案是 Fn(允许闭包和柯里化函数):

type FunctionRR = dyn Fn( &f32 ) -> f32;

对吗?

此外:

 (0..=10).map( |i:i32| i as f32 * 0.1 ).collect();

很好但是

 xs.iter().map( |x:f32| x*x ).collect();

不是。

take_samples() 函数设计了这个解决方案,现在接受函数和 closures/lambdas 并规避 map() 调用问题:

fn take_samples<T: Fn(Real)->Real>( xs: &ListOfReal, f: T ) 
   -> ListOfReal {

    return xs.iter().map( |x| f(*x) ).collect();
} // ()

fn id( x: Real ) -> Real {
    x
}

fn main() {
    let xs = generate_xs( 0.0, 10.0, 20 );

    let ys = take_samples( &xs, |x| x*x );
    let ys2 = take_samples( &xs, &id );
}