解构后的TypeScript的Array.map与Rust等效吗?

时间:2018-10-23 21:40:03

标签: typescript rust

在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文档,也许我只是不了解,但是我还没有找到关于在Rust中执行TypeScript操作的1:1等效方法。是否可以在Rust中执行这种类型的分解?也许使用mapfilter_map

1 个答案:

答案 0 :(得分:4)

Rust还通过pattern matching进行了破坏:

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. 锈向量本身不实现map和朋友-这些操作属于iterators。这些是 lazy ,这使Rust的效率比相应的JS高得多。
  3. 有多种字符串类型。
  

如果我想破坏多个物业怎么办?

如果要匿名收集字段,通常使用 tuple

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

没有带有命名字段的一次性结构的概念。