Ruby Can';t使用原始IO::console捕获第一个CRLF

Ruby Can';t使用原始IO::console捕获第一个CRLF,ruby,io,console,Ruby,Io,Console,我试图在循环中使用IO::console::getch从控制台获取输入,但是getch似乎无法捕获第一个换行符(我需要按两次enter键才能断开循环),而getc可以,但无法处理我想做的其余部分 如何捕获第一个CRLF,这样就不需要按enter键两次 相关代码: require 'io/console' buffer,str=IO::console(),"" loop do buffer.write "\r\033[32m"+str+"\033[0m" chr=buffer.g

我试图在循环中使用
IO::console::getch
从控制台获取输入,但是
getch
似乎无法捕获第一个换行符(我需要按两次enter键才能断开循环),而
getc
可以,但无法处理我想做的其余部分

如何捕获第一个CRLF,这样就不需要按enter键两次

相关代码:

require 'io/console'

buffer,str=IO::console(),""
loop do
    buffer.write "\r\033[32m"+str+"\033[0m"
    chr=buffer.getch

    break if chr=="\r"
    str+=chr
end
print "\n"+str

在查看了的系统扩展模块的源代码后,我发现我可以在Windows上使用
WinAPI.\u getch
,在Unix上使用
STDIN.getbyte
,来完成我想要的任务(显然没有完成代码,因为我还没有检查
SIGINT
或类似的东西)


你不会说你使用的是什么操作系统,但通常你只能在Windows上看到CRLF。Linux和Mac OS仅使用
“\n”
。如果您能解释一下您正在尝试做什么,可能会有所帮助,因为人们通常不会试图使用
getch
来编写控制台或读取单个字符,所以看起来您正在为自己做更多的工作。
require 'highline/system_extensions'
include HighLine::SystemExtensions

# assign getchar as a lambda based on OS
if (/mingw|win|emx/=~RUBY_PLATFORM)!=nil
    getchar=lambda{WinAPI._getch} # Windows
else
    getchar=lambda{STDIN.getbyte} # Unix
end

str="" # empty string to start
loop do
    # write the string to STDOUT in green as a test
    STDOUT.write "\r\033[32m"+str+"\033[0m"
    # call the lambda, convert to character
    chr=getchar[].chr

    return str if chr=="\r"
    str+=chr
end