我有一个ruby脚本,它同时和异步地从服务器接收和显示消息,并允许用户在控制台上输入。当收到消息时,它当前正在用户正在键入的内容中写入。输入本身没有乱码,但看起来很糟糕。理想情况下,它会保存用户当前输入,输出消息,然后在下一行恢复输入。我通过拦截每一个击键来完成这个,但我记得的是,这是一个很大的麻烦。我对红宝石很新,所以我不确定是否有一个很好的方法来做到这一点,或者如何做到这一点。
示例:用户正在输入>abcde
,消息hello
进来,用户输入fgh
。控制台现在显示:
>abcdehellofgh
用户可以在最后继续输入。我希望它能显示出来:
hello
>abcdefgh
答案 0 :(得分:2)
我提案的两个重要部分是:
1. system(“stty raw -echo”)#即可立即获得与
组合的任何类型字符
2.使用STDIN.getc和string-var作为输入缓冲区来重新打印用户输入。
按9(&布尔变量incoming_message)用于服务器消息的超简单模拟。
(更加现实会使这个例子膨胀而不会增加太多,因为无论如何你必须适应你的场景。)
按x退出。
示例输出:
$ ruby simultaneous_input_and_output.rb
Hello World!9
The incoming message is: true
Hello World!9x
You entered:
Hello World!9x
End!
#!/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!"
P.S .: for system(“stty raw -echo”)见(用户周杰伦) How to get a single character without pressing enter?
答案 1 :(得分:1)
我将面临几乎相同的问题。
我决定改变方法。我打算写一个简单的客户端,底部有一个文本输入框,屏幕的其余部分有一个消息窗口。
客户端和服务器将使用某种消息格式交换数据 - 可能是YAML,因为它与Ruby一起工作得很好,但它可能会相当简单。
(但我不确定这只是你问题的答案。)