次のようなより簡潔な方法がありますか?簡潔な方法にオプションを付ける
fn boxed_option<T>(thing: Option<T>) -> Option<Box<T>> {
match thing {
Some(x) => Some(Box::new(x)),
None => None,
}
}
次のようなより簡潔な方法がありますか?簡潔な方法にオプションを付ける
fn boxed_option<T>(thing: Option<T>) -> Option<Box<T>> {
match thing {
Some(x) => Some(Box::new(x)),
None => None,
}
}
はい:彼らはそうpervasivelyルーストに使用されているよう
thing.map(Box::new)
私は強くIterator
、Option
とResult
上のすべてのメソッドを記憶することをお勧めします。 Option
およびResult
はそれぞれ固有のメソッドが25個未満であり、その多くは2つのタイプ間で重複しています。利用可能なものを知り、それを記憶するために、少なくともそれらのすべてを読んでください。正確な名前を見つけるために、ドキュメントを再び開くことができます。
私は実際には非常にこれを動作させることはできません。
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>>`
ここで元のコードは、それがまた、形質オブジェクトを作成し、ちょうど別のタイプを変換するwan't。私はなぜ、暗黙的なことが許さ形質オブジェクトを作成するためのそのフォーム確かに言うことができず、これではありません。
foo.map(|f| Box::new(f));
しかし、あなたが代わりに言うことができる:
foo.map(|f| Box::new(f) as Box<FnMut()>);
(及び必要はありませんがもちろん、変数の型を指定します)。 Box<Option<T>>
のだろう "Option
ボクシング"
Pedantically、。
"*すべてのメソッド*"は非常に多く...おそらく、 'map()'、 'map_err()'、 'and_then()'で始まるかもしれません。他の多くの型( 'Iterator'、' Option'と 'Result'とは別に)もあります。しかし、私は同意します:ほとんどの方法に精通していることは重要です。 –
私は実際にはこれを正常に動作させることはできません。 [このコード](https://play.rust-lang.org/?gist=0c2b17c5bc7c0a8507d3f60cd2043357&version=stable&backtrace=0)を参照してください。私は[この関連する質問](https://stackoverflow.com/questions/29879372/expected-trait-coreopsfnmut-found-type-parameter)を見つけましたが、まだそれを解決できません。/noob – Timmmm
(私がリンクしているコードは 'map'を使用していませんが、実際のコードで' match'を 'map'に置き換えると同じ問題が表示されます) – Timmmm