Ruby跳过在带有参数的上一个GET之后的GET
我有一个使用gets参数的多行输入,效果非常好。问题是它跳过了我的下一个Ruby跳过在带有参数的上一个GET之后的GET,ruby,gets,Ruby,Gets,我有一个使用gets参数的多行输入,效果非常好。问题是它跳过了我的下一个 print "Multi-line response: " response = gets("done").chomp print "One line response: " oneLine = gets.chomp 前两行按预期运行(在键入“完成”并按enter键之前,我可以输入多行文本)。然后打印“一行响应:”并退出程序。我从来没有得到一行的输入 为什么会发生这种情况?内核#get实际上可以接受一个参数,一个分隔符
print "Multi-line response: "
response = gets("done").chomp
print "One line response: "
oneLine = gets.chomp
前两行按预期运行(在键入“完成”并按enter键之前,我可以输入多行文本)。然后打印“一行响应:”并退出程序。我从来没有得到一行的输入
为什么会发生这种情况?内核#get实际上可以接受一个参数,一个分隔符。这会告诉Ruby何时停止从stdin读取。如果不提供此参数,将使用默认值\n
($/
)。以下是程序运行时发生的情况:
请求所有内容,直到第一次获取
完成
- 您先键入内容,然后键入“完成”,然后按enter键。这是关键,因为现在输入流以
结束,但done\n
只读取到gets
done
会请求所有内容,直到第一个获取
在\n
完成后立即找到此
,并且\n
已经有了它,因为您已经键入了它,所以它不会再要求您了获取
获取
后,您没有机会输入任何内容。要消除此问题,您应该使分隔符“done\n”
,或者如果您希望它严格处于自己的行上,则可能是“\ndone\n”
。调用get(“done”)
时,Ruby会读取STDIN,直到找到任何出现的done
。这不一定需要在一行上,甚至不需要在行的开头或结尾。Ruby将在您输入包含done
的行后返回
现在,Ruby将只读取输入,直到消耗完done
。其余的输入将不会被读取,但将保留在缓冲区中。因此,在您的情况下,如果在终端中输入一行包含done
,然后按enter键,Ruby将只使用done而不使用换行符
换行符(或者通常是done
后面的剩余行)将只被下一个获取的
使用。因此,您的第二个直接返回
要解决此问题,使用分隔符参数来get
的更好方法是使用循环:
response = ""
while line = gets do
response << line
break if line == "done\n"
end
response.chomp!
response=“”
当line=开始工作时
回复我刚刚登录查看您在其他问题中的评论。我已经在那里更新了我的答案,但是@itdoesnetwork完全正确。谢谢你提供的详细信息!我怎么也想不到!