在一个答案中,我找到了一个等待您的输入的节并打印出来,直到按下Enter:
require 'io/console'
require 'io/wait'
loop do
chars = STDIN.getch
chars << STDIN.getch while STDIN.ready? # Process multi-char paste
break if chars == ?n
STDOUT.print chars
end
但是,要退出loop
,我必须按" Enter&quot"(新行 - n
)两次,或者在其之后按其他内容。
当我尝试再次执行相同的循环时(复制将其放入同一pry会话)时,我会得到:
IOError: byte oriented read for character buffered IO
chars << STDIN.getch while STDIN.ready?
导致上述升高,错误。没有这条线,Ruby只是不会显示任何错误。
在两种情况下(有和没有上线),在循环中:
当我按ENTER时,然后一些字母(例如'z')我会遇到此错误。
在下一个循环中,上面的字母将显示(没有我的输入)。当我按两次输入 - 没有错误时,它将退出。
在下一个循环中,当我按一些字母时,错误将显示。
在下一个循环中,上面的字母将显示
我记得在C或C 中有flush
,因此您可以清空缓冲区。我发现了几种方法,并尝试这样的方法:
loop do
STDIN.ioflush
STDOUT.ioflush
STDOUT.iflush
STDIN.iflush
STDOUT.oflush
STDIN.oflush
chars = STDIN.getch
chars << STDIN.getch while STDIN.ready?
break if chars == ?n
STDOUT.print chars
end
但是它不起作用。
如何使用 Enter和第二个字母&amp;IOError
。我认为两者都以某种方式相关。
该答案中的代码是我为个人使用而写的类似高线库的简化版本。我本人从未遇到过这个特定错误,但这可能是由于我实际上使用的东西略有不同。我的实际代码更像是这样:
require 'io/console'
require 'io/wait'
catch(:done) do
loop do
chars = STDIN.getch
chars << STDIN.getch while STDIN.ready? # Process multi-char paste
throw :done if ["r", "n", "rn"].include?(chars)
STDOUT.print chars
end
end
STDOUT.print "n"
我也有杀戮信号处理程序,以防CTRL C(杀死过程)或Ctrl D(输入的结尾)被按下;第一个中断程序,第二个打断了以像按下Enter一样反应。
确切的行为可能取决于OS(我在OSX和FreeBSD上使用),因为Enter键可以根据OS返回"r"
,"n"
或"rn"
的任何一个:
r n, r, n它们有什么区别?