Коллекции
Кратко
vector
// способ объявления 1 - неизменяемый, new, явный тип let v: Vec<i32> = Vec::new(); // способ объявления 2 - через макрос let v = vec![1, 2, 3]; // способ объявления 3 - изменяемый, new, тип определится при push let mut v = Vec::new(); v.push(5); // получение элемента let v = vec![1, 2, 3, 4, 5]; // при выходе за границы будет panic let third: &i32 = &v[2]; println!("The third element is {}", third); // при выходе за границы можно обработать ветку None match v.get(2) { Some(third) => println!("The third element is {}", third), None => println!("There is no third element."), } // итерация let v = vec![100, 32, 57]; for i in &v { println!("{}", i); } // изменяемая итерация let mut v = vec![100, 32, 57]; for i in &mut v { *i += 50; } // Vector хранит только один тип, но его можно расширить через enum enum SpreadsheetCell { Int(i32), Float(f64), Text(String), } let row = vec![ SpreadsheetCell::Int(3), SpreadsheetCell::Text(String::from("blue")), SpreadsheetCell::Float(10.12), ];string
// способ инициализации 1 - new let mut s = String::new(); // способ инициализации 2 - to_string let data = "initial contents"; let s = data.to_string(); // способ конкатенации 1 - push_str s.push_str("bar"); // способ конкатенации 2 - push s.push('l'); // способ конкатенации 3 - + let s1 = String::from("Hello, "); let s2 = String::from("world!"); let s3 = s1 + &s2; // s1 перемещается // способ конкатенации 4 - format! let s1 = String::from("tic"); let s2 = String::from("tac"); let s3 = String::from("toe"); let s = format!("{}-{}-{}", s1, s2, s3); // в Rust у string три представления "नमस्ते" // Байты (Bytes), скалярные значения (Scalar Values), графемные кластеры (Grapheme Clusters). По порядку это выглядит так [224, 164, 168, 224, 164, 174, 224, 164, 184, 224, 165, 141, 224, 164, 164, 224, 165, 135] // for b in "नमस्ते".bytes() ['न', 'म', 'स', '्', 'त', 'े'] // for b in "नमस्ते".chars() ["न", "म", "स्", "ते"] // стандартная библиотека не предоставляет функцию для for-in итерации // при получении части string нельзя напрямую обращаться по индексу // let s1 = String::from("hello"); let h = s1[0]; // можно использовать slice let hello = "Здравствуйте"; // здесь каждая графема требует 2 байта для хранения let s = &hello[0..4]; // но нужно следить за корректностью range: при [0..1] будет panic во время выполненияhash map
// инициализация let mut scores = HashMap::new(); // добавление/перезапись значения scores.insert(String::from("Blue"), 10); scores.insert(String::from("Yellow"), 50); // получение значения let score = scores.get(&color); // цикл for-in for (key, value) in &scores { println!("{}: {}", key, value); } // добавляется, если значения нет scores.entry(String::from("Yellow")).or_insert(50); scores.entry(String::from("Blue")).or_insert(50);
Источник
https://doc.rust-lang.org/std/collections/index.html https://doc.rust-lang.org/book/ch08-00-common-collections.html
…
Методы итерации по строкам
К счастью, к элементам строки можно обращаться и другими способами.
Если нужно работать с отдельными скалярными значениями Unicode, лучше всего использовать метод chars. Вызов chars для «नमस्ते» разделяет строку и возвращает шесть значений типа char, и по результату можно итерироваться, чтобы получить каждый элемент:
for c in "नमस्ते".chars() {
println!("{}", c);
}
Этот код выведет следующее:
न
म
स
्
त
े
Метод bytes возвращает каждый сырой байт, что может подходить для вашей задачи:
for b in "नमस्ते".bytes() {
println!("{}", b);
}
Этот код выведет 18 байт, из которых состоит эта String:
224
164
// --snip--
165
135
Но помните: валидные скалярные значения Unicode могут состоять более чем из 1 байта.
Получать графемные кластеры из строк сложно, поэтому стандартная библиотека такую возможность не предоставляет. Если она вам нужна, на crates.io есть крейты.