当用户的输入为 42 时,我试图停止用户的输入。
我正在处理的网站上的正确答案是:
while line = gets
break if (/42/ =~ line)
x << line
end
我试过的不起作用的代码是:
while line = gets.chomp
break if (line == 42)
x << line
end
为什么会这样?我是否遗漏了我可以在if
声明中使用的一些限制?
问题是 42 是一个整数,但却line
是一个字符串:
1.9.3p392 :001 > "42" == 42
=> false
因此,您的 if 语句永远不会被触发,因为它正在比较两种不同的事物。与正则表达式匹配可以修复它,尽管它正在寻找“42”出现在输入中的任何位置(例如“3427”)。我想你的意思是
while line = gets.chomp
break if (line == "42")
x << line
end
换句话说,当输入是包含字符 4 和 2 的字符串时中断。
<<
是对象或类对象的方法(Append
) 。但是您 没有对此类对象进行任何引用。这样你就得到了。Array
String
x
undefined local variable or method 'x' for main:Object (NameError)
试试这个(通过修复局部变量x
来保存一个实际的对象并将line
值转换为Fixnum
对象:
x = "hi"
while line = gets.chomp
break if (line.to_i == 42)
x << line
end
这个程序会帮助你to halt input from a user when their input is 42
。
我怀疑这是因为您正在将数字与字符串进行比较。该示例使用它出现的正则表达式。"42" == 42 在红宝石中会给你 false 。
until (line = gets.chomp).to_i == 42
x << line
end
这当然绕过了您所询问的 if 语句。
您对 if 的限制仅基于您将始终是字符串的字符串与数字进行比较的事实,而这永远不会相等。(正如其他人提到的)
所以我们必须重新考虑条件语句。在这种情况下,我认为它“不合适”并将比较移动到“while”循环,然后将其反转为“until”语句,以便能够积极地表达结束循环的条件。每当我在循环中看到“中断”时,我都会尝试消除这种气味,因为如果可能的话,离开循环的条件应该在循环条件中真正表达出来。
我希望这有帮助。