2

假设我有如下代码片段:

var value = foo(key);

match value {
    int intVal => return intVal;

    string|float|boolean|map|() x => {
        error err = { message: "Expected an 'int', but found '<type_of_x>'"  };
        throw err;
    }
}

foo()返回一个联合:int|string|float|boolean|map|()

在上述情况下,我期望返回值是“int”类型,如果不是,我希望打印一个错误,说 anint是预期的,但找到type_of_x了。这可以在芭蕾舞女演员中完成吗?

4

3 回答 3

1

你可以这样做

function main(string... args) {
    var value = foo();
    match value {
        int val => {
            io:println(val);
        }
        any x => {
            error err = { message: "Expected an 'int', but found 'any'"  };
            throw err;
        }
    }
}

function foo() returns(any) {
    any myInt = "hello";
    return myInt;
}

现在你不能typeof告诉类型,但是应该输入 foo(),因此你应该知道可用的选项。因此,您可以与他们匹配。

于 2018-05-11T15:44:54.513 回答
1

Ballerina 语言目前没有类似的运算符typeof。但是,我可以建议一个明显的解决方法来扩展 Nuwan 的解决方案。

function bar () returns int {
    var value = foo();

    string typeName;
    match value {
        int intVal => return intVal;
        string => typeName = "string";
        float => typeName = "float";
        boolean => typeName = "boolean";
        map => typeName = "map";
        () => typeName = "nil";
    }

    error err = { message: "Expected an 'int', but found '" + typeName + "'"  };
    throw err;
}

function foo() returns int|string|float|boolean|map|() {
    return "ddd";
}
于 2018-05-11T17:49:06.360 回答
1

让我再补充一点——给定的值可以是 Ballerina 中任意数量的类型。这是因为类型是一组值,没有什么能阻止同一个值出现在多个集合中。

因此“typeof”的想法真的是不可能的。

于 2018-05-14T02:50:57.527 回答