如何在水晶中进行用户输入

lea*_*123 5 crystal-lang

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
Run Code Online (Sandbox Code Playgroud)

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

ast*_*ite 5

要获得用户输入,您必须了解gets工作原理。String当用户输入某些内容或nil用户未输入任何内容(例如用户按下 ctrl+C)时,它将返回 a 。

在 Ruby 中,如果你这样做:

x = gets.chomp.to_i
Run Code Online (Sandbox Code Playgroud)

并运行它,但按 ctrl+C 会在屏幕上打印出一个难看的异常。也许这是可以接受的,但这是 Crystal 不会让您轻易通过的事情,因为 Crystal 是类型安全的,您将不得不处理这种情况。也许你想打印一些对用户很好的东西而不是一个例外?

处理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
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用to_nil!,如果值为 ,则本质上会引发异常nil

a = gets.not_nil!.chomp.to_i
Run Code Online (Sandbox Code Playgroud)

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

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

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

a = read_line.chomp.to_i
Run Code Online (Sandbox Code Playgroud)

(虽然在我现在的实验中它似乎没有提高,我不知道为什么,可能是一些错误......)