[英]How do I add the same integer to each element of a vector in Rust?
在 Python 中,如果我有一個列表並想為每個元素添加 10,我會這樣做:
bar = [2,4,5,6,7]
bar = [x + 10 for x in bar]
導致: [12,14,15,16,17]
。 如何在 Rust 中做到這一點? 是做一個for循環並遍歷每個向量元素的唯一方法嗎?
執行此操作的 Rust 方法與 Python 非常相似:使用迭代器! 粗略相當於 Python 的列表理解是iter::map
來獲取新元素, iter::collect
來收集到一個新的向量(或其他類型的集合)。
例如,如果bar
是Vec<i32>
(或任何其他原始 integer 類型)並且您想為每個元素添加 10,請嘗試
bar = bar.into_iter().map(|x| x + 10).collect();
或者,您可以使用
bar.iter_mut().for_each(|x| *x += 10);
這基本上就像一個 for 循環,但更簡潔一些。 這通常比第一種方法更有效,因為您不需要分配新向量(足夠智能的編譯器可能能夠避免這種情況)。 唯一的缺點是這個版本不太靈活。 output 仍然需要是一個向量; 你不能切換到 hash 設置或你有什么。 您也無法保留舊向量的副本。 請參閱下面的一些可能的示例。
fn main() {
let mut bar = vec![2, 4, 5, 6, 7];
// Overwrite the old vector
bar = bar.into_iter().map(|x| x + 10).collect();
println!("new bar: {:?}", bar);
let bar = vec![2, 4, 5, 6, 7];
// Make a completely new vector
// Note that this works only because i32 implements the Copy trait,
// so we can make copies of the elements of bar without any problems
// In more general situations, we may need to clone each element
let foo: Vec<_> = bar.iter().map(|&x| x + 10).collect();
println!("old bar: {:?} (it's still around)", bar);
println!("new foo: {:?}", foo);
use std::collections::HashSet;
let bar = vec![2, 4, 5, 6, 7];
// transform the data and collect it into a HashSet
// instead of a vector
let bar: HashSet<_> = bar.into_iter().map(|x| x + 10).collect();
println!("new bar: {:?} (note that now bar is unordered)", bar);
let mut bar = vec![2, 4, 5, 6, 7];
// Overwrite the old vector in place
bar.iter_mut().for_each(|x| *x += 10);
println!("new bar: {:?}", bar);
}
這是基本代碼,說明了如何按照問題默認的方式進行操作。 它可能對像我這樣的 Rust 的初學者有用:
fn increment_mut(p: &mut Vec<i32>, to_add: i32){
for i in 0..p.len() {
p[i] += to_add;
}
}
fn main() {
let mut p = vec![2, 4, 5, 6, 7];
increment_mut(&mut p, 10);
// Print the complete vector in Debug.
println!("{:?}", p)
}
$ cargo run
[12, 14, 15, 16, 17]
iter_mut
fn increment_mut2(p: &mut Vec<i32>, to_add: i32) {
for x in p.iter_mut() {
*x += to_add;
}
}
fn main() {
let mut p = vec![2, 4, 5, 6, 7];
increment_mut2(&mut p, 10);
// Print the complete vector in Debug.
println!("{:?}", p)
}
$ cargo run
[12, 14, 15, 16, 17]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.