是否有更简洁的方法来实现以下目标?
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)
是:
thing.map(Box::new)
Run Code Online (Sandbox Code Playgroud)
我会强烈建议记忆上的所有方法Iterator,Option并且Result因为它们是如此普遍地鲁斯特使用.Option并且Result每种方法的固有方法少于25种,其中许多方法在两种类型之间存在大量重叠.至少阅读所有这些内容以了解可用内容并记住它.您可以随时再次打开文档以查找确切的名称.
我实际上不能让这个工作.
Run Code Online (Sandbox Code Playgroud)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>>`
这里的原始代码不仅仅是将一种类型转换为另一种类型,它还创建了一个特征对象.我不能肯定地说为什么创建特征对象的形式允许隐含,这不是:
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>>.
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |