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
}
}
Run Code Online (Sandbox Code Playgroud)
上面是一个小例子,我在结构中使用了闭包。当我通过调用闭包时,generator()
我得到了no method named generator found
。当我用它包裹它时()
不会发生这种情况。这是为什么?
Rust 中的类型可以同时具有同名的字段和方法,例如
struct Foo {
bar: i32,
}
impl Foo {
fn bar(&self) -> i32 {
self.bar
}
}
fn main() {
let foo = Foo { bar: 42 };
dbg!(foo.bar());
}
Run Code Online (Sandbox Code Playgroud)
按照 getter 方法获取的字段来命名 getter 方法是一种常见的约定。Rust 语言设计者决定通过使用单独的语法来访问字段名称和方法名称,以避免它们之间的冲突。带括号形式的表达式foo.bar()
始终调用方法。没有直接相邻括号的形式的表达式foo.bar
引用字段。因此,如果要调用存储在字段中的函数指针,则需要在字段访问表达式周围添加额外的括号。