之前获取参数后,Ruby跳过了

时间:2015-02-10 23:27:46

标签: ruby gets

我有一个使用gets参数的多行输入,效果很好。问题是它正在跳过我的下一次获取......

print "Multi-line response: "
response = gets("done").chomp

print "One line response: "
oneLine = gets.chomp

前两行按预期运行(我可以输入多行文字,直到我输入完毕并按回车键)。然后打印“One line response:”并退出程序。我从来没有为oneLine输入。

为什么会这样?

2 个答案:

答案 0 :(得分:2)

Kernel#gets实际上可以接受一个参数,一个分隔符。这告诉Ruby何时停止从stdin读取。如果您未提供此参数,则会使用默认值\n$/)。这是程序运行时会发生什么:

  • gets询问所有内容,直到第一个done
  • 您键入内容,然后键入done,然后按Enter键。这是关键,因为现在输入流以done\n结尾,但gets只读到done
  • gets询问所有内容,直到第一个\n \n后发现done getsgets已经有"done\n"因为您已输入它所以它不再要求你了。

这就是为什么你在第一个"\ndone\n"之后没有机会输入任何内容的原因。要消除此问题,您应该创建分隔符{{1}},或者{{1}},如果您希望它完全属于它自己的行。

答案 1 :(得分:0)

调用gets("done")时,Ruby会读取STDIN,直到找到done的任何内容。这不一定需要在一行上,甚至在行的开头或结尾。输入包含done的行后,Ruby将返回。

现在,Ruby只会读取输入,直到消耗了done。其余的输入将不会被读取,但会保留在缓冲区中。因此,在您的情况下,如果您在终端中输入包含done的单行并按Enter键,则Ruby将仅使用已完成但不使用换行符。

换行符(或通常是done后面的其余部分)只会被下一个gets使用。因此,您的第二个gets会直接返回。

要解决这个问题,那么使用分隔符参数gets的更好方法是使用循环:

response = ""
while line = gets do
  response << line
  break if line == "done\n"
end
response.chomp!