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) }