简洁的方式来选择一个选项

Tim*_*mmm 0 optional rust

是否有更简洁的方法来实现以下目标?

fn boxed_option<T>(thing: Option<T>) -> Option<Box<T>> {
    match thing {
        Some(x) => Some(Box::new(x)),
        None => None,
    }
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 6

是:

thing.map(Box::new)
Run Code Online (Sandbox Code Playgroud)

我会强烈建议记忆上的所有方法Iterator,Option并且Result因为它们是如此普遍地鲁斯特使用.Option并且Result每种方法的固有方法少于25种,其中许多方法在两种类型之间存在大量重叠.至少阅读所有这些内容以了解可用内容并记住它.您可以随时再次打开文档以查找确切的名称.


我实际上不能让这个工作.

fn function_2<F>(foo: Option<F>)
    where F: 'static + FnMut()
{
    let tmp: Option<Box<FnMut()>> = foo.map(Box::new);
}
Run Code Online (Sandbox Code Playgroud)
error[E0308]: mismatched types
  --> src/main.rs:14:37
   |
14 |     let tmp: Option<Box<FnMut()>> = foo.map(Box::new);
   |                                     ^^^^^^^^^^^^^^^^^ expected trait std::ops::FnMut, found type parameter
   |
   = note: expected type `std::option::Option<Box<std::ops::FnMut()>>`
   = note:    found type `std::option::Option<Box<F>>`
Run Code Online (Sandbox Code Playgroud)

这里的原始代码不仅仅是将一种类型转换为另一种类型,它还创建了一个特征对象.我不能肯定地说为什么创建特征对象的形式允许隐含,这不是:

foo.map(|f| Box::new(f));
Run Code Online (Sandbox Code Playgroud)

但是,你可以说:

foo.map(|f| Box::new(f) as Box<FnMut()>);
Run Code Online (Sandbox Code Playgroud)

(当然,无需在变量上指定类型).


迂腐地说,"拳击Option"将是Box<Option<T>>.