如何在Crystal中进行用户输入


puts "Input a number"
A = gets.try(&.to_i) || 0
puts "Ok now another number"
B = gets.try(&.to_i) || 0
def main 
puts "Value of multiplication is #{A} * #{B}, Which equals = #{A * B}"
puts "Value of addition is #{A} + #{B}, Which equals = #{A + B}"
puts "Value of division is #{A} / #{B}, Which equals = #{A / B}"
puts "Value of minus is #{A} - #{B}, Which equals = #{A - B}"
puts "Value of modulus is #{A} % #{B}, Which equals = #{A % B}"
end 
main

我想知道从Crystal中的整数获得用户输入的最简单方法是什么?类似于Ruby的gets.chomp.to_i

要获得用户输入,您必须了解gets是如何工作的。当用户输入内容时,它将返回一个String,或者当用户没有输入任何内容时(例如,用户按下ctrl+C(,返回nil

在Ruby中,如果你这样做:

x = gets.chomp.to_i

然后运行它,但按ctrl+C键,屏幕上就会打印出一个丑陋的异常。也许这是可以接受的,但这是克里斯托不会让你那么容易通过的,因为克里斯托是类型安全的,你必须处理这种情况。也许你想打印一些对用户好的东西,而不是一个例外?

这里解释了处理Nil的方法:https://crystal-lang.org/api/0.25.1/Nil.html

例如,你可以做:

a = gets
if a # if a is a String
a = a.chomp.to_i # turn it into an integer
else
exit # just silently quit the program
end

另一种方法是使用to_nil!,在值为nil:的情况下,它本质上会引发异常

a = gets.not_nil!.chomp.to_i

这与Ruby更相似,因为当用户使用ctrl+C退出时,控制台中会显示一个异常关键的区别在于,Crystal(通过nil(让您知道这种可能性可能发生,并且您应该选择在这种情况下该做什么

有更多的方法来处理这种情况(比如其他评论中建议的try解决方案(,这取决于您希望代码的简洁程度

最后一个更接近Ruby的选择是使用read_line,在没有输入的情况下会引发,所以你可以这样做:

a = read_line.chomp.to_i

(尽管在我现在的实验中,它似乎没有上升,但我不知道为什么,可能是一些错误…(

这将执行您想要的操作,这样程序在用户给您一个有效的int之前不会继续。如果您只想抛出一个错误,那么您不需要循环或try-catch语句。

while true
puts "give me a valid int:"
begin
i = gets.not_nil!.to_i
break
rescue
puts "that wasn't a valid int."
end
end
puts "you gave me: #{i}"

这里有两种解决方法:

粗糙的道路:

print "Input a number: "
a = gets
print "now another number: "
b = gets
begin
a = a.not_nil!.to_i
b = b.not_nil!.to_i
puts "Value of multiplication is #{a} * #{b}, Which equals = #{a * b}"
puts "Value of addition is #{a} + #{b}, Which equals = #{a + b}"
puts "Value of division is #{a} / #{b}, Which equals = #{a / b}"
puts "Value of minus is #{a} - #{b}, Which equals = #{a - b}"
puts "Value of modulus is #{a} % #{b}, Which equals = #{a % b}"
rescue e : Exception
puts sprintf "error: input a or b is invalid: a = %s, b = %s", a, b
end

正常方式:

def input(input : String) : Int
value = 0
loop do
print input
begin
a = gets
value = a.to_s.to_i  # Force convert (String | Nil) to String then Int32.
break
rescue
# do nothing
end
end
value
end
a = input "Input a number: "
b = input "now another number: "
puts "Value of multiplication is #{a} * #{b}, Which equals = #{a * b}"
puts "Value of addition is #{a} + #{b}, Which equals = #{a + b}"
puts "Value of division is #{a} / #{b}, Which equals = #{a / b}"
puts "Value of minus is #{a} - #{b}, Which equals = #{a - b}"
puts "Value of modulus is #{a} % #{b}, Which equals = #{a % b}"

相关内容

  • 没有找到相关文章

最新更新