cap*_*aig 5 ruby console input
我有一个ruby脚本,它同时和异步地从服务器接收和显示消息,并允许用户在控制台上输入.当收到消息时,它当前正在用户正在键入的内容中写入.输入本身没有乱码,但看起来很糟糕.理想情况下,它会保存用户当前输入,输出消息,然后在下一行恢复输入.我通过拦截每一个击键来完成这个,但我记得的是,这是一个很大的麻烦.我对ruby很新,所以我不确定是否有一个很好的方法来做到这一点,或者如何做到这一点.
示例:用户正在键入>abcde,消息hello进入,用户键入fgh.控制台现在显示:
>abcdehellofgh
Run Code Online (Sandbox Code Playgroud)
用户可以在最后继续输入.我希望它显示:
hello
>abcdefgh
Run Code Online (Sandbox Code Playgroud)
我的建议的两个重要部分是:
1. system("stty raw -echo") # 立即获取任何键入的字符
2. 使用 STDIN.getc 和 string-var 作为输入缓冲区来重新打印用户输入。
按 9(和布尔变量传入消息)用于对服务器消息进行超简单的模拟。
(更现实会在不增加太多内容的情况下使示例变得臃肿,因为无论如何你都必须根据你的场景调整这个想法。)
按 x 退出。
示例输出:
$ ruby simultaneous_input_and_output.rb
Hello World!9
The incoming message is: true
Hello World!9x
You entered:
Hello World!9x
End!
Run Code Online (Sandbox Code Playgroud)
#!/usr/bin/ruby
$input_buffer = "";
incoming_message = false
begin
system("stty raw -echo")
begin
str = STDIN.getc
print str.chr
$input_buffer = $input_buffer + str.chr
if str.chr == '9'
incoming_message = true
end
if incoming_message
puts "\nThe incoming message is: " + incoming_message.to_s
print $input_buffer
incoming_message = false
end
end while (str.chr != 'x')
ensure
system("stty -raw echo")
end
puts "\n\nYou entered:"
puts $input_buffer
puts "End!"
Run Code Online (Sandbox Code Playgroud)
PS:对于系统(“stty raw -echo”)请参阅(用户Jay) 如何在不按回车键的情况下获取单个字符?