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

How do I read an int from command line in 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 and also studied https://ballerina.io/learn/api-docs/ballerina/io.html#readln 但没有成功。

我做错了什么?

似乎是 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);
    }
}

Update - 正如@supun 在下面提到的,它不是 any->int 转换中的错误,它是我不知道的实现细节。

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

当您将输入读取为 any choice = io:readln("Enter choice 1 - 5: "); 时,choice 变量的类型为 any,它将包含一个 string 值。但是,anytypeX(在本例中为 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: "); 是更好的解决方案。

在 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
    }
}