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

时间:2016-12-17 17:48:50

标签: rust optional

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

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

1 个答案:

答案 0 :(得分:6)

是:

thing.map(Box::new)

我强烈建议记住IteratorOptionResult上的所有方法,因为它们在Rust中非常普遍使用。 OptionResult每种方法的固有方法少于25种,其中许多方法在两种类型之间存在大量重叠。至少阅读所有这些内容以了解可用内容并记住它。您可以随时再次打开文档以查找确切的名称。

  

我实际上无法让它发挥作用。

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

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

小心翼翼地,&#34;拳击Option&#34;将是Box<Option<T>>