装箱选项的简洁方法

Concise way to box an Option

有没有更简洁的实现方式?

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

是:

thing.map(Box::new)

我强烈建议记住 IteratorOptionResult 上的所有方法,因为它们在 Rust 中被广泛使用。 OptionResult 各有不到 25 个固有方法,其中许多方法在这两种类型之间有很大的重叠。至少阅读所有这些以了解可用的内容并记住它们。您随时可以再次打开文档以找到确切的名称。


I actually can't quite get this to work.

fn function_2<F>(foo: Option<F>)
    where F: 'static + FnMut()
{
    let tmp: Option<Box<FnMut()>> = foo.map(Box::new);
}
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>>`

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

foo.map(|f| Box::new(f));

但是,您可以改为说:

foo.map(|f| Box::new(f) as Box<FnMut()>);

(当然不需要指定变量的类型)。


迂腐地说,"boxing an Option" 将是 Box<Option<T>>