用于 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 );
}
只是想为 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 foundfn ( 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 );
}