如何解决错误“Fn`-族特征'类型参数的精确格式可能会发生变化”?

时间:2016-12-26 13:31:22

标签: rust traits

我在Rust中编写了一个问题解决器,作为一个子程序需要调用一个以黑盒子形式给出的函数(基本上我想给出一个Fn(f64) -> f64类型的参数。)

基本上我有一个定义为fn solve<F>(f: F) where F : Fn(f64) -> f64 { ... }的函数,这意味着我可以像这样调用solvesolve(|x| x);

我想要做的是将更复杂的函数传递给求解器,即依赖于多个参数等的函数。

我希望能够将具有合适特征实现的结构传递给求解器。我尝试了以下方法:

struct Test;
impl Fn<(f64,)> for Test {}

这会产生以下错误:

error: the precise format of `Fn`-family traits' type parameters is subject to change. Use parenthetical notation (Fn(Foo, Bar) -> Baz) instead (see issue #29625)

我还想添加一个包含Fn特征的特征(不幸的是我不知道如何定义)。那可能吗?

编辑: 只是为了澄清:我已经用C ++开发了很长一段时间,C ++解决方案是重载operator()(args)。在这种情况下,我可以像函数一样使用structclass。我希望能够

  1. 将两个函数和结构作为参数传递给求解器。
  2. 有一种简单的方法来调用这些功能。调用obj.method(args)obj(args)(在C ++中)更复杂。但似乎目前无法实现这种行为。

1 个答案:

答案 0 :(得分:6)

直接答案是完全按照错误消息所说的那样做:

  

使用括号表示法

即使用Fn<(A, B)>

,而不是Fn(A, B)

真正的问题就是你not allowed to implement the Fn* family of traits yourself in stable Rust

你问的真实问题更难以确定,因为你还没有提供MCVE,所以我们沦为猜测。我说你应该把它翻过来;创建一个新的特征,为闭包和你的类型实现它:

trait Solve {
    type Output;
    fn solve(&mut self) -> Self::Output;
}

impl<F, T> Solve for F
where
    F: FnMut() -> T,
{
    type Output = T;

    fn solve(&mut self) -> Self::Output {
        (self)()
    }
}

struct Test;
impl Solve for Test {
    // interesting things
}

fn main() {}