我可以获得联合类型变量的实际类型吗?

Can I get the actual type of a union type variable?

假设我有如下代码片段:

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() return 一个联合:int|string|float|boolean|map|()

在上面的例子中,我希望 return 值是 'int' 类型,如果不是,我想打印一个错误,说 int 是预期的但找到了type_of_x 代替。这可以在 Ballerina 中完成吗?

你可以这样做

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() ,因此您应该知道可用的选项。因此你可以和他们比赛。

芭蕾舞语言目前没有类似于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";
}

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

所以"typeof"的想法实在不行