是否可以在结构体中生成并存储闭包:当前正在获取类型不匹配的错误
pub struct MM<F>
where
F: Fn(&f64, &f64) -> f64,
{
pub n: f64, //
pub y: f64, //
p: f64, // the p parameter associated with prior probability
f: F, // this must only take two arguments
}
impl<F> MM<F>
where
F: Fn(&f64, &f64) -> f64,
{
pub fn new(l: f64, prior: f64) -> Self {
let func = |a: &f64, b: &f64| -> f64 { b.powf(prior) * a };
MM {
n: l,
y: l,
p: prior,
f: func,
}
}
}
1条答案
按热度按时间h79rfbju1#
我对你发布的代码做了一些调整。主要是我改变了
new
的返回类型(see explanation here解释了为什么这是必要的)。我还在new
的结构体创建中将CFMM
改为MM
,看起来像是一个打字错误。简短的版本为不耐烦:你不能从
new
返回Self
并在里面放一个闭包,编译器会告诉你每个闭包都有不同的类型,因此无法始终匹配参数
F
的**调用方选择的类型这里的关键元素是“caller-chosed”。Rust不能保证我们在
new
中构造的闭包将匹配调用者决定的F
应该是什么。一旦你让new
显式地决定它将返回什么impl Fn(...)
,它就工作了。here也有更多的解释。
Playground