rust 我是否应该只对闭包使用Fn、FnMut和FnOnce?

0wi1tuuw  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(190)

场景:我想写一个优化器算法,它以一个单变量函数作为参数。我想让它同时使用闭包和结构体实现某种方法来计算优化后的函数的值。我应该声明我的优化器以FnMut参数或其他特征为参数,这些特征可以由我想传递给优化器的任何结构体实现吗?

66bbxpm5

66bbxpm51#

你不能(yet)自己在稳定的Rust上实现Fn特性,你应该定义自己的特性来进行计算,然后你可以为你的结构体和任何实现Fn(或FnMut)的类型实现这些特性:

// I'm opting for `&mut self` here as it's more general
// but this might not be necessary for your use case
trait Calculate<T, U> {
    fn calculate(&mut self, t: T) -> U;
}

// Because `Fn: FnMut` this will also implement `Calculate` for `Fn`.
impl<F, T, U> Calculate<T, U> for F
where F: FnMut(T) -> U {
    fn calculate(&mut self, t: T) -> U {
        (self)(t)
    }
}

struct State {
    flag: bool,
}
impl<T, U> Calculate<T, U> for State
where T: Into<U> {
    fn calculate(&mut self, t: T) -> U {
        self.flag = true;
        // or whatever calculation you actually need to do here
        t.into()
    }
}

相关问题