我能否使用方法或函数作为闭包?

9

我有一些在结构体中的方法,我想将它们作为参数传递。我相信传递函数的唯一方法是使用闭包。是否有一种方法可以做到这一点而不使用 || { self.x() }

1个回答

14
你可以完全使用方法或函数作为闭包。你需要使用函数或方法的完整路径,包括特征方法:
一个自由函数:
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);
}

一个内在的方法:

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);
}

一种特性方法:

fn main() {
    let name = Some("hello");
    let owned_name = name.map(ToOwned::to_owned);
}

请注意,参数类型必须完全匹配,包括按引用传递或按值传递。


2
顺便提一下,特质方法可以通过几种方式指定,例如 str::to_owned(当作用域中只有一个 str 上的 to_owned 时)可以工作,<str>::to_owned<str as ToOwned>::to_owned 也可以,后者是完全限定形式。 - huon
如果方法接收者没有通过迭代器传递怎么办?例如,int_iter.map(int_taker.take_int)(其中takes_int是一个类似于fn(&self, I: i64) -> i64的方法)? - weberc2

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