2016-06-13 5 views
1

私のコードに基づいてVecとから要素を削除すると、次のようになります。Barをコピーまたは複製することを許可されていないことをいくつかの条件

struct Bar { 
    i: i32, 
} 

struct Foo { 
    v: Vec<Bar>, 
} 

impl Foo { 
    fn foo(&mut self) { 
     self.v.drain(self.v.iter().filter(|b| b.i < 10)); 
    } 
} 

注意。

この条件を満たさないすべてのBarを削除します。当初私はそれらを反復してremoveと呼ぶことができたと思っていましたが、完全に意味のある不変の借りがあれば、2つの可変の借用または1つの可変的な借入を許されません。

最も簡単なことは、ちょうどclone,filtercollectになると思いますが、複製またはコピーすることはできません。

どうすればよいですか?

答えて

5

Vecのインターフェイスを見ると、述語に基づいていくつかの要素を消去するメソッドが見つかりません。代わりにretainがあります。は、述語に基づいて要素をに保ちます。

もちろん、両方とも対称です。メソッド名を「削除」または「消去」(説明に「削除」が含まれています)でフィルタリングすると、retainを見つけるのが難しくなります。

提供された例は、自身のために語っています:毎晩ラストで

let mut vec = vec![1, 2, 3, 4]; 
vec.retain(|&x| x % 2 == 0); 
assert_eq!(vec, [2, 4]); 
1

、あなたはVec::drain_filterを使用することができます。

#![feature(drain_filter)] 

#[derive(Debug)] 
struct Bar { 
    i: i32, 
} 

fn main() { 
    let mut bars = vec![Bar { i: 1 }, Bar { i: 10 }, Bar { i: 3 }, Bar { i: 100 }]; 
    bars.drain_filter(|b| b.i < 10); 
    println!("{:?}", bars); 
} 

drain_filter程度余分に興味深い何が返すようあなたが拒否された値を得ることができるということですそれらのイテレータ:

let rejects: Vec<_> = bars.drain_filter(|b| b.i < 10).collect(); 

また、反復される値を変更することを選択します。

bars.drain_filter(|b| { 
    b.i -= 1; 
    b.i < 10 
}); 
関連する問題