如何通过成员变量调用函数?

16

玩Rust时,我将某些代码提取到一个类中。为了保持它的自包含性但同时分离功能,我想保留回调函数并稍后调用它。为了保持简单,包括跳过显而易见的fn new(),我们有以下内容:

pub struct Toy {
    go: fn(count: i16) -> String,
}

impl Toy {
    fn lets_go(&mut self, n: i16) -> String {
        self.go(n)
    }
}

建筑让我感到...

...path.../src/toy.rs:7:14: 7:19 error: type `&mut toy::Toy` does not implement any method in scope named `go`
...path.../src/toy.rs:7         self.go(n)

我猜测,可能有一种特殊的语法(或完全不同的结构)可以理解 self.go() 的调用,但我在任何文档中都没有看到类似情况的示例或描述,因此我希望得到任何指引。

显然,.go 可能属于一个类似函数对象的类,但这在 Rust 中似乎不是很惯用的写法。

1个回答

24

foo.bar(...) 总是被解析为一个方法调用,而不会寻找字段。这避免了歧义,特别是对于特质(trait)。可以通过将调用和字段访问分成两个独立的表达式来强制它成为字段访问,例如:

let f = self.go;
f(n)

或者更好的方法,只需(self.go)(n)

问题#2392涵盖了改进这些诊断的内容。


太好了。我应该猜到加括号会有帮助,但我从来没有想到过。谢谢! - John C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接