为什么我必须用 () 包裹闭包?

Use*_*645 4 closures rust

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。当我用它包裹它时()不会发生这种情况。这是为什么?

Sve*_*ach 9

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引用字段。因此,如果要调用存储在字段中的函数指针,则需要在字段访问表达式周围添加额外的括号。