Rust 绑定函数参数和传递绑定函数的惯用方法
是否有一种惯用的方法来绑定函数参数并生成新函数 例如,假设我有以下函数:Rust 绑定函数参数和传递绑定函数的惯用方法,rust,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(val
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)
}
还有生命周期的问题。我想知道扩展eq()
中target
的生存期的正确语义是什么,因此它的生存期绑定到已装箱函数的生存期
是否有一种惯用的方法来绑定函数参数并生成新函数
是的,Rust的闭包实际上是函数+绑定环境
因此,绑定函数参数或部分应用它,只需形成一个闭包,该闭包将使用几个固定参数调用此函数
eq使用的Box
机制是否是一种将参数绑定到函数以在evaluate
中使用的合理方法
现在是这样
生锈闭包的问题在于它们是伏地魔类型(即无法命名的类型)。因此,虽然您可以将闭包分配给局部变量,并让推理推断类型,但实际上无法从function1返回它
目前,解决方法是在这种情况下返回->Box..>
但是,评估
的签名是不必要的约束。您可以选择参考,而不是选择框
:
fn evaluate(f: &Fn(i32) -> bool, value: i32) -> bool { f(value) }
这将允许可以直接调用evaluate
的用户不在堆上进行分配(这是框
所做的)
1正在进行的工作允许将返回类型指定为->impl SomeTrait
,这将允许您这样做
还有生命周期的问题。我想知道扩展eq()
中target
的生存期的正确语义是什么,因此它的生存期绑定到已装箱函数的生存期
延长寿命是不可能的;生命周期是描述性的,而不是规定性的:它只是一种表示实际生命周期的符号,而不是一种指定值应该具有的生命周期的方法
对于闭包,您可能希望将其环境移动到闭包中;通过值而不是引用来捕获。它应该可以解决大多数的生命周期问题
对于剩余的生存期问题,实际上可以反过来,通过表示闭包环境的生存期来约束闭包的类型:F:Fn(i32)->bool+'a
标记F
仅对'a有效。为什么要传递&i32
,而不是i32
?好的观点。没有真正的理由在这里传递引用而不是移动。我会更新这个问题。
fn evaluate(f: &Fn(i32) -> bool, value: i32) -> bool { f(value) }