我有一个使用gets参数的多行输入,效果很好。问题是它正在跳过我的下一次获取......
print "Multi-line response: "
response = gets("done").chomp
print "One line response: "
oneLine = gets.chomp
前两行按预期运行(我可以输入多行文字,直到我输入完毕并按回车键)。然后打印“One line response:”并退出程序。我从来没有为oneLine输入。
为什么会这样?
答案 0 :(得分:2)
Kernel#gets
实际上可以接受一个参数,一个分隔符。这告诉Ruby何时停止从stdin读取。如果您未提供此参数,则会使用默认值\n
($/
)。这是程序运行时会发生什么:
gets
询问所有内容,直到第一个done
。done\n
结尾,但gets
只读到done
。gets
询问所有内容,直到第一个\n
\n
后发现done
gets
,gets
已经有"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!