在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中执行这种类型的分解?也许使用map
或filter_map
?
答案 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:
Partial
类型的概念。map
和朋友-这些操作属于iterators。这些是 lazy ,这使Rust的效率比相应的JS高得多。如果我想破坏多个物业怎么办?
如果要匿名收集字段,通常使用 tuple :
fn get_name_things(Person { name, .. }: Person) -> (String, usize) {
(name, 42)
}
没有带有命名字段的一次性结构的概念。