关于Ballerina中记录类型包含机制的疑问
Ballerina记录类型包含机制及疑问解析
一、初始开放记录的类型包含运作逻辑
你定义的初始代码如下:
type Record1 record {| int a; string b; string...; |}; type Record2 record {| boolean c; string[] d; int...; |}; type Record record { *Record2; *Record1; };
此处Record是开放记录(未使用{|}闭合标记),类型包含的运作规则为:
- 通过
*语法,Record会合并Record1和Record2的所有显式字段,最终拥有int a、string b、boolean c、string[] d四个固定字段。 - 开放记录允许同时包含多个带rest描述符的开放记录,此时实例的额外字段需满足所有被包含记录rest类型的交集(这里
string和int的交集为空,意味着该开放记录实际上无法添加任何额外字段,但语法层面不会报错)。
二、闭合记录无自定义rest时的报错原因
当你将Record改为闭合记录:
type Record record {| *Record2; *Record1; |};
出现错误cannot use type inclusion with more than one open record with different rest descriptor types,原因是:
闭合记录({|}标记)要求字段约束完全明确,不允许隐式合并不同类型的rest描述符。Record1的rest类型为string...,Record2的rest类型为int...,两者类型冲突,编译器无法自动确定闭合记录的额外字段类型,因此抛出错误。
三、添加自定义rest后错误消失的规则依据
当你添加float...后:
type Record record {| *Record2; *Record1; float...; |};
错误消失的核心是Ballerina的rest描述符覆盖规则:
当闭合记录显式定义了自己的rest描述符时,该描述符会直接覆盖所有被包含开放记录的rest描述符。此时闭合记录的额外字段类型由自定义的float...决定,不再需要合并被包含记录的冲突rest类型,完全符合语法规范,因此编译器不再报错。
内容的提问来源于stack exchange,提问作者LUHEERATHAN THEVAKUMAR
相关产品推荐
相关产品推荐

