Ruby跳过在带有参数的上一个GET之后的GET

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实际上可以接受一个参数,一个分隔符

我有一个使用gets参数的多行输入,效果非常好。问题是它跳过了我的下一个

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完全正确。谢谢你提供的详细信息!我怎么也想不到!