Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I call a function through a member variable?

Tags:

rust

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.

like image 490
John C Avatar asked Jan 16 '15 23:01

John C


1 Answers

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.

like image 119
huon Avatar answered Oct 21 '22 22:10

huon