我们先通过一段代码来了解这一关键字的作用
我们看见此处的代码定义了一个接口,一个类型,一个函数,和三个不同函数的类型,我们先看不同调用函数的方式,可以清晰的看见,有两个报错,一个正常调用;
我们看见Record关键字里传入的是两个参数,这是默认的,传一个或穿多个则会报错,有兴趣的可以试试;
然后我们看它们所传参数的类型,其中有两个是以对象的方式传入,一个不是以对象的方式传入,我们可以清楚的看见,不以对象方式传入的会有明显的报错,而以对象传入的则是由一个有轻微的报错,而其中一个是完全没有报错
此时,我们不能直接的出结论,但我们可以假设:
假设1:用Record定义的类型,我们传递的参数必须是一个对象
然后我们在对比两个传对象类型的为什么一个会报错而一个不会报错
细心得同学则会发现,2图虽然报错了,但也只有最后一个报错了,另外三个是完全没有错,他们和图一都有共同之处,那就是他们的属性都是Type类型上定义,而值则是接口定义的,而type类型就是record两个参数的第一个参数,而接口则是record的第二个参数
由此,我们得出第二个猜测:
猜测2:所传参数的属性,就是recode第一个参数定义的属性,而值则是第二个参数决定的
那么,疑问来了?如果我定义的参数我少传一个它会报错吗?
我们少传了一个home属性,无疑,他报错了,
我们的出猜测三,它传参数应和record定义的第一个参数包吃一致,(顺序无关)
而这三条,也查不多是我们record关键字的核心定义了
那么,我们来看看它究竟是怎么实现的
首先,我们将它分为三部分:
1、首先它是一个type类型
2、其次它确实明确定义了只能传两个参数,只是他对第一个参数添加了一个隐形的K值,他继承了我们所定义的类型,而第二个参数没有做任何的限制
3、然后他又将其值义为了一个对象,此时我们的猜测一得到证实,然后内部他又做了将继承的K映射给了P,并让其成为属性,而第二个参数成其值。此时,我们的猜测2也得到了证实,最后中间的
是【:】而不是【?:】则表示,我们所映射的必须在所传的值中存在,所以我们的猜测三也得到了证实
最后我们得出三条结论:
1、Record定义的类型,我们传递的参数必须是一个对象
2、所传参数的属性,就是recode第一个参数定义的属性,而值则是第二个参数决定的
3、它传参数应和record定义的第一个参数包吃一致,(顺序无关)