Как мне прочитать int из командной строки в Ballerina? - PullRequest
0 голосов
/ 03 июня 2018
any choice = io:readln("Enter choice 1 - 5: ");

Кажется, я не могу привести данные к типу int.

При проверке и сопоставлении возникает одна и та же ошибка

var intChoice = <int>choice;
match intChoice {
    int value => c = value;
    error err => io:println("error: " + err.message);
}

и

c = check <int>choice;

дает

error: 'string' cannot be cast to 'int'

Я смотрел на https://ballerina.io/learn/by-example/type-conversion.html а также учился https://ballerina.io/learn/api-docs/ballerina/io.html#readln но не повезло.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Текущее поведение на самом деле правильно, и заражение не является ошибкой.Позвольте мне объяснить поведение.

Когда вы читаете ввод как any choice = io:readln("Enter choice 1 - 5: ");, переменная choice имеет тип any и будет содержать значение string.Однако способ работы any до typeX (в данном случае int) заключается в том, что он проверит, имеет ли фактическое значение в переменной любого типа значение typeX (int), и если да, товыполните преобразование.

В этом случае фактическое значение внутри произвольной переменной choice равно string.Теперь, если мы попытаемся преобразовать это в int, оно потерпит неудачу, потому что оно не содержит целого числа внутри.Таким образом, правильный подход - сначала получить строковое значение внутри переменной любого типа, а затем преобразовать строку в int на втором шаге.См. Пример ниже:

import ballerina/io;

function main(string... args) {
    any choice = io:readln("Enter choice 1 - 5: ");
    string choiceStr = <string>choice;
    int choiceInt = check <int> choiceStr;
    io:println(choiceInt);
}

Но, конечно, чтение cmd-ввода непосредственно в строку типа: string choice = io:readln("Enter choice 1 - 5: "); - лучшее решение.

0 голосов
/ 03 июня 2018

Похоже, что это ошибка в преобразовании any -> int.

Если вы измените тип переменной выбора на string или измените оператор определения переменной на оператор присваивания, используя var, оба подхода будутработает.Пожалуйста, обратитесь к приведенному ниже примеру.

import ballerina/io;

function main(string... args) {
    // Change the any to string or var here.
    string choice = io:readln("Enter choice 1 - 5: ");
    int c = check <int>choice;
    io:println(c);

    var intChoice = <int>choice;
    match intChoice {
        int value => io:println(value);
        error err => io:println("error: " + err.message);
    }
}

Обновление - Как упоминалось ниже @supun, это не ошибка в преобразовании any->int, это подробности реализации, которой я не былв курсе.

...