更正未调用 运行 次的函数

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