2017-05-18 8 views
2

ルースベクトルを作成してループを使って構造体インスタンスを埋め込むことができますが、次のような高次関数の1つを使って同じ結果を得ることができるかどうかは疑問でしたmapなどである。ここで 高次関数を使ってオブジェクトでルストベクトルを塗りようとする

は動作しますいくつかのコードです:

#[derive(Debug)] 
pub struct sim { 
    id: i32, 
} 

impl Default for sim { 
    fn default() -> sim { 
     sim { id: 4 } 
    } 
} 

fn main() { 
    let mut v2 = Vec::<sim>::new(); 
    for i in 0..7 { 
     v2.push(sim::default()) 
    } 
    println!("{:?}", v2); 
} 

が、私は以下のコードを試してみましたが、それはうまくいきませんでした。

let mut v3 = Vec::<sim>::new(); 
(0..7).map(|| v3.push(sim::default())); 
+0

慣用的な錆スタイルは、タイプに 'PascalCase'を使用することです。 'sim'は正しくない、' Sim'はそうです。あなたは 'v2'に型ヒントを与える必要もありません - あなたが' sim'を押すという事実は型を推論するのに十分です。 – Shepmaster

+0

ハハ@シェパママスターに感謝します。私はここで一日のうちに最小限の例を得るだろう;) – krishnab

答えて

8

あなたの当面の問題は次のとおりです。mapはすべてでをどのように動作するかではないこと。マッピングは、シーケンスを取得し、前記シーケンス内の各要素を変換して新しいシーケンスを生成することを含む。あなたはちょうど2つの理由で副作用を実行するためにそれを使用しないでください。

  1. 誰がに行くされていないが、あなたがそれを行うためにを期待し、それは誰にでもあるべきよりもので、あなたのコードがさらに混乱になりますそうでなければそれを読む。

  2. 錆のイテレータは遅延計算されます。つまり、マップされたイテレータを消費しない限り、何も起こりません。

あなたが本当に何かを7回行いたい場合は、はちょうどループを使用しています。それは彼らがforだということです。実際にはが必然的にのような処理が必要な場合は、クレートにはforeachというメソッドがありますが、これはまだ何が起こっているかを伝えています。実際に高階関数を使用してコレクションを構築する方法として

...

#[derive(Clone, Debug)] 
pub struct Sim { 
    id: i32, 
} 

impl Default for Sim { 
    fn default() -> Sim { 
     Sim { id: 4 } 
    } 
} 

fn main() { 
    use std::iter; 

    let v1 = vec![Sim::default(); 7]; 
    let v2: Vec<_> = iter::repeat(Sim::default()).take(7).collect(); 
    let v3: Vec<_> = (0..7).map(|_| Sim::default()).collect(); 
    let v4: Vec<_> = iter::once(Sim::default()).cycle().take(7).collect(); 
} 

おそらくよりあります。 v1v2、およびv4は、コピーを作成できるようにアイテムタイプがCloneである必要があります。

+0

*これは彼らのためのものである* - ああ、あなたがそこで何をしたのか分かります。 – Shepmaster

+3

@Shepmaster:あなたが話していることが分からないと確信しています... –

+0

クールこれは参考になります。はい、私はループを書くことができます、それは私が最初にやったことです。私は錆の高次関数を理解しようとしており、それらにもっと快適になるようにしようとしています。アイデアをありがとう、私はこれらの自分自身を考えていないだろう。 – krishnab

関連する問題