Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
470 views
in Technique[技术] by (71.8m points)

rust - Can I use a method or a function as a closure?

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() }?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...