Rust также имеет деструктуризацию посредством сопоставления с образцом :
struct Person {
name: String,
address: String,
}
fn get_name(Person { name, .. }: Person) -> String {
name
}
fn main() {
let people = vec![Person {
name: String::from("Sally"),
address: String::from("1234 E Test St."),
}];
let names: Vec<_> = people.into_iter().map(get_name).collect();
println!("{:?}", names);
}
Однако вы обычно не увидите, чтобы люди делали этот тип деструктурирования в сигнатурах функций.Это предоставляет больше реализации в автоматически сгенерированной документации.Чаще встречается это сразу внутри функции:
fn get_name(person: Person) -> String {
let Person { name, .. } = person;
name
}
И люди не часто используют деструктуризацию в let
переменных, если они не извлекают много значений.В этом случае короче просто использовать поле напрямую:
fn get_name(person: Person) -> String {
person.name
}
Эта конкретная функция не super полезна, поэтому я также обычно вижу ее как замыкание:
.map(|p| p.name)
В вашем оригинальном TypeScript есть много вещей, которые не переводятся непосредственно в Rust:
- Концепция типа
Partial
. - Векторы Rustсами не реализуют
map
и друзей - эти операции принадлежат итераторам .Это lazy , что позволяет Rust быть намного более эффективным, чем соответствующий JS. - Существует несколько типов строк.
Что еслиЯ хотел деструктурировать более одного свойства?
Если вы хотите анонимную коллекцию полей, вы обычно используете кортеж :
fn get_name_things(Person { name, .. }: Person) -> (String, usize) {
(name, 42)
}
Нет понятия одноразовых структур с именованными полями.