更正函数,不称为运行时

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

以上是关于更正函数,不称为运行时的主要内容,如果未能解决你的问题,请参考以下文章

编译cpp文件时代码不并行,但是c是并行的

片段事务分离和附加后ListView不工作?

使用带数组的find_if()时代码段出错

当派生类的析构函数是虚拟的而基类的 dtor 不是时代码崩溃

运行时代码覆盖工具

c#:运行时代码分析 - 任何现有的库?