如何使用流控制请求用户输入整数而不是字符串

How to use flow control to request the user inputs an integer as opposed to a string

我的程序要求用户输入号码。我正在使用流量控制来确保用户只输入数字,如果用户输入数字以外的任何内容,程序会提示用户 "Please enter a number"。即使用户输入了一个数字,请求用户 "Please enter a number" 的流程控制语句也会运行。

我没有收到任何错误消息,但我的 if/else 语句之一的语法一定不合适。我已经研究过应该将 "variable" 设置为什么以实现所需的输出,但我一定没有合适的布尔值。

puts "Enter a number."
variable = gets.chomp
variable = variable.to_i

if variable != Integer
 puts "Please enter a number."
elsif variable == Integer 
 puts "Thank you. Your number is #{variable}."
end

即使我实际在终端输入一个数字,我也只得到 "Please enter a number." 我希望当我输入一个数字时,我会得到“Thank you. Your number is #{variable}.

比较 Integer 并得到 true 的唯一方法是将 Integer 与 Integer 进行比较:

Integer == Integer
# true

在那种情况下你需要的是使用 Object#is_a? 如果 class 是 obj 的 class,则 return 为真,或者如果class 是包含在 obj:

中的对象或模块的超class之一
module M;    end
class A
  include M
end
class B < A; end
class C < B; end

b = B.new
b.is_a? A          #=> true
b.is_a? B          #=> true
b.is_a? C          #=> false
b.is_a? M          #=> true

这允许您检查对象是否为整数 "based",但是请注意,您正在将 variable 重新定义为其 to_i 版本,这将 return始终为整数。

您可以使用 String#match 来检查用户输入的值是否与数字匹配(正整数或负整数):

unless variable.match?(/^-?\d*$/)
  ...
end

问题是 != and == 个方法。

有关检查字符串是否可以转换为有效整数的更好方法,请参阅: Test if a string is basically an integer in quotes using Ruby?

你最好使用 if else statement

如果加一个is_integer?如上面 link 所示的字符串 class 的方法(但你不必只是一种方法)你可以这样检查:

var_string = gets.chomp
if var_string.is_integer?
  do_something
else
  do_something_else
end