ReasonML 记录模式匹配的正确方法
Proper way of ReasonML record pattern-matching
我有一个记录类型,
type person = {
name: string,
gender: string,
age: int
}
并且有很多符合该类型的记录。我想做的是只从人中提取 [name, age] 并创建一个新记录。为此,我最初想到使用一种模式匹配技术,
switch(input) {
|({name, _, gender} => //make a new record by extracting only name and age
|_ => ();
}
这种方法有意义吗?如果是这样,我应该怎么做?
如果不是,从记录中删除键(记录是不可变的,所以这实际上没有意义)或从现有记录中提取另一条记录的正确方法是什么?
您实际上不需要切换到 pattern-match。
基本上,只需使用
let {name, gender, age: _} = input
足以提取你想要的两个属性。
你可以像这样创建一个辅助函数:
type person = {
name: string,
gender: string,
age: int,
};
type nameAndGender = {
name: string,
gender: string,
};
let personToNameAndGender = (person) => {
let {name, gender, age: _} = person;
{name, gender};
};
请记住,您需要预先定义这两种记录类型。
注意:如果只匹配部分记录,也可以省略年龄
let {name, gender}: person = person;
但是您需要对其进行注释,因为类型系统无法自动确定它是两条记录中的哪一条。
这里是working example.
我有一个记录类型,
type person = {
name: string,
gender: string,
age: int
}
并且有很多符合该类型的记录。我想做的是只从人中提取 [name, age] 并创建一个新记录。为此,我最初想到使用一种模式匹配技术,
switch(input) {
|({name, _, gender} => //make a new record by extracting only name and age
|_ => ();
}
这种方法有意义吗?如果是这样,我应该怎么做? 如果不是,从记录中删除键(记录是不可变的,所以这实际上没有意义)或从现有记录中提取另一条记录的正确方法是什么?
您实际上不需要切换到 pattern-match。
基本上,只需使用
let {name, gender, age: _} = input
足以提取你想要的两个属性。
你可以像这样创建一个辅助函数:
type person = {
name: string,
gender: string,
age: int,
};
type nameAndGender = {
name: string,
gender: string,
};
let personToNameAndGender = (person) => {
let {name, gender, age: _} = person;
{name, gender};
};
请记住,您需要预先定义这两种记录类型。
注意:如果只匹配部分记录,也可以省略年龄
let {name, gender}: person = person;
但是您需要对其进行注释,因为类型系统无法自动确定它是两条记录中的哪一条。
这里是working example.