從矢量中刪除元素
回答
這就是我想出迄今(也使得借檢查開心):
let index = xs.iter().position(|x| *x == some_x).unwrap();
xs.remove(index);
我仍然等待找到更好的方法來做到這一點,因爲這很醜陋。
注:我的代碼假定元素確實存在(因此爲.unwrap()
)。
迭代器有一個position()
方法,它返回匹配謂詞的第一個元素的索引。相關問題:Is there an equivalent of JavaScript's indexOf
for Rust arrays?
和代碼示例:
fn main() {
let mut vec = vec![1, 2, 3, 4];
println!("Before: {:?}", vec);
let removed = vec.iter()
.position(|&n| n > 2)
.map(|e| vec.remove(e))
.is_some();
println!("Did we remove anything? {}", removed);
println!("After: {:?}", vec);
}
這並不編譯:'xs.remove(xs.iter()位置(| X | * X == some_x)。 unwrap());' - 「不能借用'xs'作爲不可變的,因爲它也被借用爲可變」 – 2014-10-07 18:53:16
@Kai Sellgren:也被稱爲:不要修改你正在迭代的容器。 – 2014-10-10 13:11:39
可以使用retain
method但它會刪除該值的每一個實例:
fn main() {
let mut xs = vec![1, 2, 3];
let some_x = 2;
xs.retain(|&x| x != some_x);
println!("{:?}", xs); // prints [1, 3]
}
有一個實驗性的API,叫Vec::remove_item()
。它仍然不穩定,所以它不適用於穩定的編譯器。但最終可能會穩定下來(tracking issue)。 。
根據該方法,做你想要真的是很簡單:
let removed = xs.remove_item(&some_x);
請注意,stdlib仍在設計中,因此它可能缺少其他語言中常見的一些功能。隨意提交公關添加! – aochagavia 2014-10-08 08:52:29