【问题标题】:Break in While Loop when Specific Input is Entered输入特定输入时进入 While 循环
【发布时间】:2013-05-09 07:06:23
【问题描述】:

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

我正在研究的网站上的正确答案是:

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

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

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

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

【问题讨论】:

  • 由于您是新手,这不会有太大帮助,但请注意 Ruby 是一种语言,由于块,声明性代码是可能的。我认为这样的事情非常简洁:lines = repeat { gets }.take_while { |line| line.strip != "42" }(填补缺失方法的空白;-))
  • 谢谢!如此明显,在我的鼻子底下。我不知何故假设 Ruby 会神奇地将 42 识别为字符串。

标签: ruby compare ruby-2.0


【解决方案1】:

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

【讨论】:

  • 请注意 gets 返回回车符。也许line.chomp == "42"
  • @tokland OP 的代码已经有了 chomp,但为了清楚起见,我已经编辑了我的答案以包含完整的代码块。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    &lt;&lt;ArrayString 类对象上的方法(Append)。但是您的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

    【讨论】:

      【解决方案4】:
      until (line = gets.chomp).to_i == 42   
        x << line 
      end
      

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

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

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

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2019-08-24
        • 1970-01-01
        • 2013-11-16
        • 2020-02-15
        • 2015-12-11
        • 2018-03-23
        • 2021-05-13
        • 2016-04-26
        • 2013-04-23
        相关资源
        最近更新 更多