如何在 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
值。但是,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: ");
是更好的解决方案。
在 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
}
}
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
值。但是,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: ");
是更好的解决方案。
在 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
}
}