Могу ли я получить фактический тип переменной типа объединения? - PullRequest
0 голосов
/ 11 мая 2018

Предположим, у меня есть фрагмент кода, как показано ниже:

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, и в противном случае я хочу напечатать ошибку, говоря, что ожидалось int, но вместо этого найдено type_of_x. Можно ли это сделать в балерине?

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

На языке балерины на данный момент нет оператора, похожего на 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";
}
0 голосов
/ 14 мая 2018

Позвольте мне добавить еще один момент - данное значение может иметь любое количество типов в балерина.Это потому, что тип - это набор значений, и ничто не мешает одному и тому же значению находиться в более чем одном наборе.

Поэтому идея «typeof» действительно невозможна.

0 голосов
/ 11 мая 2018

Вы можете сделать как

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 () должен быть напечатан, и поэтому вы должны знать доступные опции.Поэтому вы можете противостоять им.

...