struct Counter<T>
where
T: Fn() -> i32,
{
generator: T,
val: i32,
}
impl<T> Counter<T>
where
T: Fn() -> i32,
{
pub fn new(gen: T) -> Counter<T> {
Counter {
generator: gen,
val: 0,
}
}
pub fn next(&mut self) {
self.val = (self.generator)(); // This works
// self.val = self.generator(); // This does not work
}
pub fn get(&self) -> i32 {
self.val
}
}
上面是一个小例子,我在结构体中使用了一个闭包。当我通过
generator()
调用闭包时,会出现no method named generator found
的错误。但当我用()
包装它时,就不会出现这个问题。为什么会这样呢?
self
是一个关键字,另一种看待它的方式是self.generator()
是Self::generator(self)
的语法糖,这显然需要存在一个generator
方法。括号只是强制表达式被解释为更一般的foo(bar)
函数调用语法,而不是方法解糖,这就是为什么在你的情况下它们做正确的事情。你可以通过以下方式实现相同的结果,而不需要括号:let generator = &self.generator; self.val = generator();
。 - user4815162342