【问题标题】:How do I read an int from command line in Ballerina?如何从 Ballerina 的命令行中读取 int?
【发布时间】:2018-06-03 12:35:39
【问题描述】:
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,但没有运气。

我做错了什么?

【问题讨论】:

    标签: ballerina


    【解决方案1】:

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

    【讨论】:

    • 酷,成功了!非常感谢。希望该错误将在未来的版本中得到修复。
    • 是的,它会尽快修复:)
    • 这个答案不正确。正如stackoverflow.com/users/6782170/supun-setunga 解释的io:readln() 函数返回一个string,因此您必须首先将字符串转换为int。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-12-23
        • 2018-04-26
        • 2016-05-09
        • 2016-02-20
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多