1

当用户的输入为 42 时,我试图停止用户的输入。

我正在处理的网站上的正确答案是:

while line = gets   
  break if (/42/ =~ line)
  x << line 
end

我试过的不起作用的代码是:

while line = gets.chomp
  break if (line == 42)
  x << line 
end

为什么会这样?我是否遗漏了我可以在if声明中使用的一些限制?

4

4 回答 4

2

问题是 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 的字符串时中断。

于 2013-05-09T07:16:38.140 回答
0

<<是对象或类对象的方法(Append) 。但是您 没有对此类对象进行任何引用。这样你就得到了。ArrayStringxundefined 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

于 2013-05-09T07:11:56.140 回答
0

我怀疑这是因为您正在将数字与字符串进行比较。该示例使用它出现的正则表达式。"42" == 42 在红宝石中会给你 false 。

于 2013-05-09T07:17:25.573 回答
0
until (line = gets.chomp).to_i == 42   
  x << line 
end

这当然绕过了您所询问的 if 语句。

您对 if 的限制仅基于您将始终是字符串的字符串与数字进行比较的事实,而这永远不会相等。(正如其他人提到的)

所以我们必须重新考虑条件语句。在这种情况下,我认为它“不合适”并将比较移动到“while”循环,然后将其反转为“until”语句,以便能够积极地表达结束循环的条件。每当我在循环中看到“中断”时,我都会尝试消除这种气味,因为如果可能的话,离开循环的条件应该在循环条件中真正表达出来。

我希望这有帮助。

于 2013-05-09T08:19:03.070 回答