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但没有运气。
我做错了什么?
答案 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
值。但是,any
到typeX
(在本例中为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
}
}