Что такое Rust-эквивалент Array.map TypeScript с деструктуризацией? - PullRequest
0 голосов
/ 24 октября 2018

В TypeScript вы можете отобразить и деструктурировать частичный набор данных из интерфейса, используя следующее

interface Person {
  name: string;
  address: string;
}

function getName({ name }: Person): Partial<Person> {
  return ({ name });
}

const people: Person[] = [
  {
    name: "Sally",
    address: "1234 E Test St."
  },
  // ...
];

const names = people.map(getName);
// => [{ "name": "Sally" }, ...]

Я читал документы Rust и, возможно, я просто не понимаю, ноЯ не нашел 1: 1 эквивалент того, как сделать эту операцию TypeScript в Rust.Можно ли выполнить этот тип деструктуры в Rust?Возможно, используя map или filter_map?

1 Ответ

0 голосов
/ 24 октября 2018

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:

  1. Концепция типа Partial.
  2. Векторы Rustсами не реализуют map и друзей - эти операции принадлежат итераторам .Это lazy , что позволяет Rust быть намного более эффективным, чем соответствующий JS.
  3. Существует несколько типов строк.

Что еслиЯ хотел деструктурировать более одного свойства?

Если вы хотите анонимную коллекцию полей, вы обычно используете кортеж :

fn get_name_things(Person { name, .. }: Person) -> (String, usize) {
    (name, 42)
}

Нет понятия одноразовых структур с именованными полями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...