Lambda 从包含Rust中泛型的trait方法返回闭包

Lambda 从包含Rust中泛型的trait方法返回闭包,lambda,functional-programming,rust,Lambda,Functional Programming,Rust,我正在学习生锈,遇到了一个与关闭有关的令人烦恼的问题。我已经有了很多基本的闭包示例,但现在我已经走出了基本的“makeadder”和“callon”示例,事情变得越来越混乱。这是我的代码的第一部分,有效: trait TransformationElt<T, F> where F: Fn(T) -> T { fn get_transform(&self) -> Box<F>; } pub struct AddSome { pub x: i64

我正在学习生锈,遇到了一个与关闭有关的令人烦恼的问题。我已经有了很多基本的闭包示例,但现在我已经走出了基本的“makeadder”和“callon”示例,事情变得越来越混乱。这是我的代码的第一部分,有效:

trait TransformationElt<T, F> where F: Fn(T) -> T {
    fn get_transform(&self) -> Box<F>;
}

pub struct AddSome { pub x: i64 }

impl AddSome  {
    fn the_transform(&self) -> Box<Fn(i64) -> i64> {
        Box::new(|x: i64| x + 1 as i64)
    }
}
经过多次黑客攻击和尝试不同的东西后,我仍然无法编译它。我通常会遇到以下错误:

src/lex/math/algebra/groups.rs:31:16:31:46错误:不匹配的类型: 预期的
F
, 找到
[closure@src/lex/math/algebra/groups.rs:31:16:31:46 self:\uz]
(应为类型参数, 发现关闭)[E0308]

我如何绕过这个看似基本的问题,实现我的“转换”类型


最后一件事——我有理由把事情保持为闭包。我打算编写它们,等等,我确实需要高阶函数的东西。

编译器正在阻止你,因为你试图欺骗它。当我们撒谎时,它很善于看穿我们程序员

你怎么撒谎的?您说过“我将编写一个采用某种任意类型(带有一些限制)的方法,然后我将返回一个只包含该类型的框”。然后继续not返回传入值的框;就编译器而言,您插入了包装垃圾

下面是一个小例子:

fn wrapper<F>(f: F) -> Box<F>
where
    F: Fn(u8) -> u8,
{
    Box::new(|x| f(x) + 1)
}
fn包装器(f:f)->Box
哪里
F:Fn(u8)->u8,
{
盒子:新的(|x | f(x)+1)
}
您真正想说的是,您将返回实现该特性的内容,但不描述如何返回(因为您无法指定闭包)。您可以使用一个装箱的特征对象间接执行此操作:

fn wrapper<F>(f: F) -> Box<Fn(u8) -> u8>
where
    F: Fn(u8) -> u8 + 'static,
{
    Box::new(move |x| f(x) + 1)
}
fn包装(f:f)->框u8>
哪里
F:Fn(u8)->u8+静态,
{
盒子:新的(移动| x | f(x)+1)
}
另见:

  • fn wrapper<F>(f: F) -> Box<Fn(u8) -> u8>
    where
        F: Fn(u8) -> u8 + 'static,
    {
        Box::new(move |x| f(x) + 1)
    }