装箱选项的简洁方法
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)
我强烈建议记住 Iterator
、Option
和 Result
上的所有方法,因为它们在 Rust 中被广泛使用。 Option
和 Result
各有不到 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>>
。
有没有更简洁的实现方式?
fn boxed_option<T>(thing: Option<T>) -> Option<Box<T>> {
match thing {
Some(x) => Some(Box::new(x)),
None => None,
}
}
是:
thing.map(Box::new)
我强烈建议记住 Iterator
、Option
和 Result
上的所有方法,因为它们在 Rust 中被广泛使用。 Option
和 Result
各有不到 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>>
。