为何无法在Ballerina隔离函数内克隆Record类型参数?
无法克隆Ballerina Record参数的原因
1. 默认Record是不可变值类型
Ballerina中,未显式声明readonly=false的Record属于不可变值类型。这类类型的设计逻辑是不允许修改,所有对它的引用都是安全的——因为值本身不会被改变,因此语言没有为不可变类型提供clone()方法。你当前的参数Record r属于默认的不可变Record,自然无法调用克隆操作。
2. 隔离函数参数默认是只读权限
即使你定义的是可变Record(即声明了readonly=false的记录类型),作为隔离函数的参数时,它会被默认标记为readonly(只读权限)。而clone()是可变类型的可变方法,需要对实例拥有可变权限才能调用,只读权限下无法执行该操作。
补充:如果需要克隆的解决方案
如果业务场景确实需要克隆Record并添加到数组,需要做两步调整:
- 定义Record时显式设置
readonly=false,声明为可变类型:type MutableRecord record {| int id; string value; readonly=false; |}; - 在隔离函数中,将参数声明为可变权限(用
var关键字),之后再调用克隆:isolated function add(var MutableRecord r) { var rClone = r.clone(); lock { arr.push(rClone); } }
内容的提问来源于stack exchange,提问作者sahanhe
相关产品推荐
相关产品推荐

