首页 文章

什么是具有解构的TypeScript的Array.map的Rust等价物?

提问于
浏览
0

在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中执行此TypeScript操作的1:1等价物 . 在Rust中可以执行这种类型的结构化吗?也许使用 mapfilter_map

1 回答

  • 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
    }
    

    这个特殊的功能并不是非常有用,所以我通常也会把它视为一个闭包:

    .map(|p| p.name)
    

    原始TypeScript中有很多东西不能直接转换为Rust:

    • Partial 类型的概念 .

    • Rust矢量本身没有实现 map 和朋友 - 这些操作属于iterators . 这些是懒惰的,这使得Rust比相应的JS更有效 .

    • 有多种字符串类型 .

    如果我想破坏多个房产怎么办?

    如果你想要一个匿名的字段集合,你通常会使用一个元组:

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

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

相关问题