2016-12-17 1 views

答えて

6

はい:彼らはそうpervasivelyルーストに使用されているよう

thing.map(Box::new) 

私は強くIteratorOptionResult上のすべてのメソッドを記憶することをお勧めします。 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、。

+0

"*すべてのメソッド*"は非常に多く...おそらく、 'map()'、 'map_err()'、 'and_then()'で始まるかもしれません。他の多くの型( 'Iterator'、' Option'と 'Result'とは別に)もあります。しかし、私は同意します:ほとんどの方法に精通していることは重要です。 –

+0

私は実際にはこれを正常に動作させることはできません。 [このコード](https://play.rust-lang.org/?gist=0c2b17c5bc7c0a8507d3f60cd2043357&version=stable&backtrace=0)を参照してください。私は[この関連する質問](https://stackoverflow.com/questions/29879372/expected-trait-coreopsfnmut-found-type-parameter)を見つけましたが、まだそれを解決できません。/noob – Timmmm

+0

(私がリンクしているコードは 'map'を使用していませんが、実際のコードで' match'を 'map'に置き換えると同じ問題が表示されます) – Timmmm

関連する問題