更正未调用 运行 次的函数
Correct functions not called run-time
我正在尝试使用 first-class 函数概括数据处理逻辑。下面是说明 运行 次失败的最小简化示例。
为什么下面的 Ballerina 项目崩溃 运行 次并出现以下输出和错误:
$ ballerina run so001
Compiling source
xxx/so001:0.1.0
Creating balos
target/balo/so001-2019r3-any-0.1.0.balo
Generating executables
target/bin/so001.jar
Running executables
bar:data
fooConversion: {"bar":"bar"}
error: {ballerina}TypeCastError message=incompatible types: 'error' cannot be cast to 'string'
at xxx.so001:$lambda(main.bal:18)
xxx.so001:$lambda[=11=](main.bal:14)
xxx.so001:main(main.bal:25)
正如您在上面看到的那样,看起来 fooConversion()
是使用 bar
数据而不是预期的 foo
数据调用的。
预期输出为:
$ ballerina run so001
Compiling source
xxx/so001:0.1.0
Creating balos
target/balo/so001-2019r3-any-0.1.0.balo
Generating executables
target/bin/so001.jar
Running executables
foo:data
fooConversion: {"foo":"foo"}
bar:data
barConversion: {"bar":"bar"}
[{"unified":"foo"}, {"unified":"bar"}]
代码
$ cat src/foo/main.bal
import ballerina/io;
public function data() returns map<json> {
io:println("foo:data");
return {foo: "foo"};
}
$ cat src/bar/main.bal
import ballerina/io;
public function data() returns map<json> {
io:println("bar:data");
return {bar: "bar"};
}
$ cat src/so001/main.bal
import ballerina/io;
import xxx/foo;
import xxx/bar;
public function main() {
json[] unified = [];
var unifier = function (
function () returns map<json> get,
function (map<json>) returns map<json> convert
) {
var j = get();
unified.push(convert(j));
};
var fooConversion = function (map<json> j) returns map<json> {
io:println("fooConversion: ", j.toJsonString());
return {unified: <string>j.foo};
};
var barConversion = function (map<json> j) returns map<json> {
io:println("barConversion: ", j.toJsonString());
return {unified: <string>j.bar};
};
// works as expected if only one of the unifier() functions is called
unifier(foo:data, fooConversion);
unifier(bar:data, barConversion);
io:println(unified.toJsonString());
}
如果我将上面的代码放入一个文件中,它会按预期工作。
我在 Ubuntu 19.04:
中使用 Ballerina 1.0.5
$ ballerina version
Ballerina 1.0.5
Language specification 2019R3
这似乎是代码生成逻辑中的一个错误,我创建了一个问题 [1] 来跟踪这个问题,修复在 PR [2]
这里的问题是因为您使用的两个方法具有相同的名称("data"),我们在内部创建的 lambda 搞砸了,所以在修复合并之前,您能否使用两个不同的名称"data" 方法
[1] - https://github.com/ballerina-platform/ballerina-lang/issues/20401
[2] - https://github.com/ballerina-platform/ballerina-lang/pull/20402
我正在尝试使用 first-class 函数概括数据处理逻辑。下面是说明 运行 次失败的最小简化示例。
为什么下面的 Ballerina 项目崩溃 运行 次并出现以下输出和错误:
$ ballerina run so001
Compiling source
xxx/so001:0.1.0
Creating balos
target/balo/so001-2019r3-any-0.1.0.balo
Generating executables
target/bin/so001.jar
Running executables
bar:data
fooConversion: {"bar":"bar"}
error: {ballerina}TypeCastError message=incompatible types: 'error' cannot be cast to 'string'
at xxx.so001:$lambda(main.bal:18)
xxx.so001:$lambda[=11=](main.bal:14)
xxx.so001:main(main.bal:25)
正如您在上面看到的那样,看起来 fooConversion()
是使用 bar
数据而不是预期的 foo
数据调用的。
预期输出为:
$ ballerina run so001
Compiling source
xxx/so001:0.1.0
Creating balos
target/balo/so001-2019r3-any-0.1.0.balo
Generating executables
target/bin/so001.jar
Running executables
foo:data
fooConversion: {"foo":"foo"}
bar:data
barConversion: {"bar":"bar"}
[{"unified":"foo"}, {"unified":"bar"}]
代码
$ cat src/foo/main.bal
import ballerina/io;
public function data() returns map<json> {
io:println("foo:data");
return {foo: "foo"};
}
$ cat src/bar/main.bal
import ballerina/io;
public function data() returns map<json> {
io:println("bar:data");
return {bar: "bar"};
}
$ cat src/so001/main.bal
import ballerina/io;
import xxx/foo;
import xxx/bar;
public function main() {
json[] unified = [];
var unifier = function (
function () returns map<json> get,
function (map<json>) returns map<json> convert
) {
var j = get();
unified.push(convert(j));
};
var fooConversion = function (map<json> j) returns map<json> {
io:println("fooConversion: ", j.toJsonString());
return {unified: <string>j.foo};
};
var barConversion = function (map<json> j) returns map<json> {
io:println("barConversion: ", j.toJsonString());
return {unified: <string>j.bar};
};
// works as expected if only one of the unifier() functions is called
unifier(foo:data, fooConversion);
unifier(bar:data, barConversion);
io:println(unified.toJsonString());
}
如果我将上面的代码放入一个文件中,它会按预期工作。
我在 Ubuntu 19.04:
中使用 Ballerina 1.0.5$ ballerina version
Ballerina 1.0.5
Language specification 2019R3
这似乎是代码生成逻辑中的一个错误,我创建了一个问题 [1] 来跟踪这个问题,修复在 PR [2]
这里的问题是因为您使用的两个方法具有相同的名称("data"),我们在内部创建的 lambda 搞砸了,所以在修复合并之前,您能否使用两个不同的名称"data" 方法
[1] - https://github.com/ballerina-platform/ballerina-lang/issues/20401
[2] - https://github.com/ballerina-platform/ballerina-lang/pull/20402