是否有更简洁的方法来实现以下目标?
fn boxed_option<T>(thing: Option<T>) -> Option<Box<T>> {
match thing {
Some(x) => Some(Box::new(x)),
None => None,
}
}
答案 0 :(得分:6)
是:
thing.map(Box::new)
我强烈建议记住Iterator
,Option
和Result
上的所有方法,因为它们在Rust中非常普遍使用。 Option
和Result
每种方法的固有方法少于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>>
。