更正函数,不称为运行时
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更正函数,不称为运行时相关的知识,希望对你有一定的参考价值。
我正在尝试使用一流的功能来概括数据处理逻辑。在下面,您将找到最小的简化示例来说明运行时故障。
为什么下面的芭蕾舞女演员项目在运行时崩溃并显示以下输出和错误:
$ 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$1(main.bal:18)
xxx.so001:$lambda$0(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]中]
这里的问题是,由于您使用的两个方法具有相同的名称(“数据”),我们在内部创建的lambda混乱了,因此在合并此修复程序之前,您可以为“数据”方法使用两个不同的名称吗?] >
[1]-https://github.com/ballerina-platform/ballerina-lang/issues/20401
[2]-https://github.com/ballerina-platform/ballerina-lang/pull/20402
以上是关于更正函数,不称为运行时的主要内容,如果未能解决你的问题,请参考以下文章