使用 gets 时,Ruby 循环无法中断

标签 ruby while-loop

我的代码应该提示用户输入数字,直到他们输入“停止”,然后返回输入的数字总数。我用两种方式编写了这个程序,当输入“stop”时,这两种方式都无法打破循环。

我的第一次尝试是使用until循环,尽管我觉得控制流效果不太好。我的第二个使用“直到真实”和“打破”。 我将 gets 的结果存储在一个变量中,以便可以将其转换为整数,并且我已经测试了在转换“stop”时删除该变量。

# 2nd attempt
total = 0

while true
  puts "Give me a number"
  gets_var = gets
  if gets_var == "stop"
    break
  else
    total += gets_var.to_i
  end
end

puts total


# 1st attempt
total = 0
gets_var = 0

until gets_var == "stop"
  puts "Give me a number"
  gets_var = gets
  total += gets_var.to_i
end

puts total

我希望在提示结束循环并返回总数时输入“stop”。在任何情况下,“停止”都不会打破循环。

为什么我的循环无法中断?

最佳答案

只需使用 String#chomp 方法即可返回不带新行分隔符的字符串:


gets_var.chomp == "stop"

https://ruby-doc.org/core-2.2.0/String.html#method-i-chomp

您可以在irb中手动查看:


irb(main):011:0> gets_var = gets
test
=> test

irb(main):012:0> pp gets_var
"test\n"
=> test

字符串末尾有一个换行符 (\n)。当您使用 gets 时,它总是出现。

关于使用 gets 时,Ruby 循环无法中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54198178/

相关文章:

c - 使用哪个循环?

c++ - 检查 Char 中的空格和检查字符串中的数字

php - 大型 MySQL 查询超时

javascript - 避免计算代码中的注释

ruby-on-rails - 使用 STOMP 进行 Rails 发布/订阅

ruby-on-rails - Rails 中带后备功能的动态命名空间 Controller

ruby-on-rails - 使用 Devise 注销时真实性 token 无效

ruby-on-rails - Rails 4 - 如何匹配命名空间中的路由

ruby - 在代码中间使用救援和确保

python - 在python和tkinter中使用while循环持续更新传感器数据