Ballerina隔离函数内调用langlib函数报错的解决方法
Ballerina代码报错修复:isolated函数中Lambda访问外部变量的问题
先看原代码:
import ballerina/io; type Person readonly & record {| string name; int age; |}; public isolated function main() returns error? { string[] fields = ["name", "age", "address"]; Person p = {name: "John", age: 30}; string[] validFields = fields.filter(fieldName => p.keys().indexOf(fieldName) > -1); io:println(validFields); }
这段代码运行时会报错:
incompatible types: expected an 'isolated' function
原因是main是isolated函数,而它调用的filter方法同样要求传入的lambda参数是isolated函数。但当前lambda捕获了外部变量p,默认情况下这种捕获外部变量的lambda不满足isolated的要求——除非捕获的变量是冻结(frozen)且只读的类型,同时显式标记lambda为isolated。
修复方法有两种:
方法一:给Lambda添加isolated修饰符
因为Person类型是readonly & record,属于冻结类型,所以可以直接给lambda加上isolated关键字,让它符合filter的参数要求:
string[] validFields = fields.filter(isolated fieldName => p.keys().indexOf(fieldName) > -1);
方法二:提前提取冻结的Keys数组
先把p的键提取出来,转为冻结的只读数组,再让lambda访问这个局部变量。此时lambda不需要捕获外部的p,自然满足isolated要求:
public isolated function main() returns error? { string[] fields = ["name", "age", "address"]; Person p = {name: "John", age: 30}; // 提取keys并转为冻结的只读数组 readonly string[] personKeys = p.keys().toArray(); string[] validFields = fields.filter(fieldName => personKeys.indexOf(fieldName) > -1); io:println(validFields); }
两种方法都能解决报错,你可以根据代码场景选择合适的方式。
内容的提问来源于stack exchange,提问作者Kavindu Gimhan Zoysa
相关产品推荐
相关产品推荐

