是否有一种惯用的Rust方法来绑定函数参数并生成一个新函数?
例如,假设我有以下功能:
fn eq(a: i32) -> Box<Fn(i32) -> bool> {
let target = a; // copy
Box::new(move |value| value == target)
}
fn evaluate(func: Box<Fn(i32) -> bool>, value: i32) -> bool {
func(value)
}
Run Code Online (Sandbox Code Playgroud)
Box机制使用的机制是将eq参数绑定到函数中以供使用evaluate吗?例如:
let is_42 = eq(42);
assert_eq!(true, evaluate(is_42, 42));
Run Code Online (Sandbox Code Playgroud)
还有生命的问题.我想知道延长targetin 的生命周期的正确语义是什么eq(),所以它的生命周期与盒装函数的生命周期有关.
是否有一种惯用的Rust方法来绑定函数参数并生成一个新函数?
是的,Rust有闭包,它实际上是函数+绑定环境.
因此,绑定函数参数或部分应用它只是形成一个闭包,它将使用一些固定的参数调用该函数.
Box机制使用的机制是将eq参数绑定到函数中以供使用evaluate吗?
现在是.
Rust闭包的问题在于它们是Voldemort类型(即,无法命名的类型).因此,虽然您可以为局部变量分配闭包,并让推断推断出类型,但您实际上无法从函数1返回它.
目前,-> Box<Fn(..) -> ..>在这种情况下,工作就会回归.
但是,您的签名evaluate是不必要的约束.而不是采取Box,你可以参考:
fn evaluate(f: &Fn(i32) -> bool, value: i32) -> bool { f(value) }
Run Code Online (Sandbox Code Playgroud)
这将让一个可以evaluate直接调用的用户自由地在堆上分配(这样Box做).
1 正在进行的工作允许指定-> impl SomeTrait允许您这样做的返回类型.
还有生命的问题.我想知道延长
targetin 的生命周期的正确语义是什么eq(),所以它的生命周期与盒装函数的生命周期有关.
不可能延长寿命; 生命周期是描述性的,而不是规定性的:它仅仅是表示实际生命周期的符号,而不是指定值应该具有的生命周期的方式.
对于闭包,你可能想要关闭move它们的环境; 采取价值而不是参考.它应该解决大多数终身问题.
对于剩余的生命周期问题,您实际上是反过来并通过表示其环境的生命周期来约束闭包的类型:仅对其有效的F: Fn(i32) -> bool + 'a标记.F'a