如何在Ballerina的命令行中读取int?

时间:2018-06-03 12:35:39

标签: ballerina

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但没有运气。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

似乎这是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转换中的错误,它是我不知道的实现细节。

答案 1 :(得分:2)

当前行为实际上是正确的,实际上并不是错误。让我解释一下这种行为。

当您将输入读作any choice = io:readln("Enter choice 1 - 5: ");时,choice变量的类型为any,并且其中包含string值。但是,anytypeX(在本例中为int)的工作方式是,它会检查any-typed变量中的实际值是否为typeX( int),如果是,则进行转换。

在这种情况下,任何类型变量choice内的实际值为string。现在,如果我们尝试将其转换为int,它将失败,因为它内部不包含整数。所以正确的方法是先在any-type变量中获取字符串值,然后在第二步中将字符串转换为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: ");这样的字符串是更好的解决方案。

答案 2 :(得分:0)

在 Ballerina swan lake 中,您可以使用内置 int package 中的 int:fromString() 方法代替强制转换将字符串转换为整数。

function typeConversionTest() {
    string input = io:readln("Enter your input: ");
    int|error number = int:fromString(input);

    if(number is error) {
        io:println("Error occurred in conversion");
    } else {
        // Fine
    }
}