How do I call a function through a member variable

2019-01-12 09:58发布

Toying with Rust, I'm extracting some code into a class. To keep it self-contained but separate functionality, I want to hang onto a callback function and call it later. To keep it simple, including skipping the obvious fn new(), we have something like:

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

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

Building gives me...

...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)

Presumably, there's a special syntax (or entirely different construct) that makes sense of the self.go() call, but I don't see examples or descriptions of comparable situations in any of the documentation, so I'd appreciate any direction.

Obviously, .go could be of a functor-like class, but that doesn't seem very idiomatic for Rust.

标签: rust
1条回答
时光不老,我们不散
2楼-- · 2019-01-12 10:15

foo.bar(...) is always parsed as a method call, it never looks for fields. This avoids ambiguity, especially with traits. One can force it to be a field access by separating the call and the field access into two distinct expressions, for example,

let f = self.go;
f(n)

Or, better, just (self.go)(n).

Issue #2392 covers improving these diagnostics.

查看更多
登录 后发表回答