Reputation: 1168
I have some methods on a struct that I'd like to pass around as parameters. I'm pretty sure the only way to pass around functions is by using closures. Is there a way I can do this without doing
|| { self.x() }
?
Upvotes: 10
Views: 5582
Reputation: 432189
You can absolutely use a method or a function as a closure. You use the full path to the function or method, including trait methods:
A free function:
struct Monster {
health: u8,
}
fn just_enough_attack(m: Monster) -> u8 {
m.health + 2
}
fn main() {
let sully = Some(Monster { health: 42 });
let health = sully.map(just_enough_attack);
}
An inherent method:
struct Monster {
health: u8,
}
impl Monster {
fn health(&self) -> u8 { self.health }
}
fn main() {
let sully = Some(Monster { health: 42 });
let health = sully.as_ref().map(Monster::health);
}
A trait method:
fn main() {
let name = Some("hello");
let owned_name = name.map(ToOwned::to_owned);
}
Note that the argument type must match exactly, this includes by-reference or by-value.
Upvotes: 16