我在Rust中编写了一个问题解决器,作为一个子程序需要调用一个以黑盒子形式给出的函数(基本上我想给出一个Fn(f64) -> f64
类型的参数。)
基本上我有一个定义为fn solve<F>(f: F) where F : Fn(f64) -> f64 { ... }
的函数,这意味着我可以像这样调用solve
:
solve(|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)
。在这种情况下,我可以像函数一样使用struct
或class
。我希望能够
obj.method(args)
比obj(args)
(在C ++中)更复杂。但似乎目前无法实现这种行为。答案 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() {}