Ruby不允许我比较值

时间:2019-02-22 05:38:24

标签: ruby

我在下面编写了代码,但是当我运行它时(包括选择正确的数字),控制台将打印调试信息。为什么是这样?我究竟做错了什么?

puts 'Welcome to the number guessing game.  I will pick a number between 1-100.  It will be your job to guess the number.  If you are incorrect, I will tell you if your guess is higher or lower than my number, I will let you know.'
puts "Time to guess!"
mine = (rand(1..100))
puts mine
grabber = gets.chomp! 
if mine == grabber
  puts 'That\'s it!'
else 
  print 'debug'
end

2 个答案:

答案 0 :(得分:2)

您正在比较两种不同类型的值。 gets返回一个字符串,rand(1..100)返回一个整数。您无法直接比较它们。您需要将它们转换为相同的类型,要么都是整数,要么都是字符串。

尝试在字符串上使用to_i将其转换为整数:

if mine == grabber.to_i

答案 1 :(得分:0)

正如@meagar所说,您正在比较不同的类型(gets中的字符串和rand中的数字),这些类型总是返回false。

话虽如此,您有几种不同的方式来强制/转换ruby中的数据类型。

@maeger显示的最常见的一种是使用to_i,但是它会导致一些奇怪的行为,因为任何不容易解析为整数的字符串都将返回0。

2.5.3 :001 > 'potato'.to_i 
=> 0
2.5.3 :002 > '0xff'.to_i 
=> 0

如果要避免这种情况,可以使用Integer(arg),这实际上是Kernel中定义的方法,将尽最大努力验证字符串是否实际上可以转换为整数以及是否失败它会产生一个ArgumentError

2.5.3 :001 > Integer('potato')
=> ArgumentError (invalid value for Integer(): 'potato')
2.5.3 :002 > Integer('2') 
=> 2
2.5.3 :003 > Integer('0xff') # Hexadecimal
=> 255 
2.5.3 :004 > Integer('0666') # Octal
=> 438
2.5.3 :005 > Integer('0b1110') # Binary
=> 14