新手问题-为什么此循环不起作用?

时间:2019-06-22 23:08:17

标签: ruby loops user-input

我假设以下代码会将用户输入的所有不同行合并为一个字符串。结果是不同的。发生这种情况的逻辑是什么?

我希望将不同的用户输入整合为一个。理想情况下,考虑到以下输入行:

一个 二 三 四

我最终会得到字符串“ one \ ntwo \ nthree \ nfour”

这是我认为可行的代码:

input = ""

while gets != nil
    secondinput= gets
    input << secondinput
end

运行上述代码后,输入最终等于“ two \ nfour”,而不是“ one \ ntwo \ nthree \ nfour”

这背后的逻辑是什么?

非常感谢!

2 个答案:

答案 0 :(得分:0)

gets将读取并返回输入行

gets条件下使用的

while将读取一行,针对nil进行检查,然后继续执行。
因此,您只需忽略输入的第二(第一,第三)行。

相反,将输入保存到变量中,并使用保存在该变量中的值进行逻辑运算

input = ""

line = gets
while line != nil
  input << line
  line = gets
end

正如@Cary Swoveland正确指出的那样,gets将永远不会返回nil,并且您将陷入无限循环。

gets返回包含“换行”的给定值,您可以摆脱换行(gets.chomp)并使代码更简单(也许更具可读性)

input = ""

line = gets.chomp
until line.empty?
  input << line
  line = gets.chomp
end

答案 1 :(得分:0)

您要在两个地方拨打gets。一次,当您检查while的条件时,一次,当您进行secondinput= gets时。因此,在与while的行上,您基本上是在读取onethree的行,并将值扔掉。

我可以使您的代码正常工作的最小更改是

input = ""

secondinput = gets
while secondinput != nil 
    input << secondinput
    secondinput = gets
end

这样,您每次循环迭代只调用一次gets