iNe*_*cas 55
从ruby 2.0.0开始,stdlib中有一个带有此功能的'io/console'
require 'io/console'
STDIN.getch
Run Code Online (Sandbox Code Playgroud)
Jay*_*Jay 33
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2999
#!/usr/bin/ruby
begin
system("stty raw -echo")
str = STDIN.getc
ensure
system("stty -raw echo")
end
p str.chr
Run Code Online (Sandbox Code Playgroud)
(在我的OS X系统上测试过,可能无法移植到所有Ruby平台).有关其他一些建议,请参阅http://www.rubyquiz.com/quiz5.html,包括Windows.
And*_*rew 19
@Jay给出了一个很好的答案,但有两个问题:
一个简单的解决方法是保存以前的tty状态并使用以下参数:
-icanon - 禁用规范输入(ERASE和KILL处理);isig - 根据特殊控制字符INTR,QUIT和SUSP启用字符检查.最后你会有这样的函数:
def get_char
state = `stty -g`
`stty raw -echo -icanon isig`
STDIN.getc.chr
ensure
`stty #{state}`
end
Run Code Online (Sandbox Code Playgroud)
Ale*_*fee 14
stty raw -echo不幸的是,raw mode()导致control-C作为一个字符而不是一个SIGINT被发送.因此,如果你想要像上面那样阻塞输入,但是允许用户点击control-C以在程序等待时停止程序,请确保执行此操作:
Signal.trap("INT") do # SIGINT = control-C
exit
end
Run Code Online (Sandbox Code Playgroud)
如果你想要非阻塞输入 - 也就是说,定期检查用户是否按下了一个键,同时又去做其他的东西 - 那么你可以这样做:
require 'io/wait'
def char_if_pressed
begin
system("stty raw -echo") # turn raw input on
c = nil
if $stdin.ready?
c = $stdin.getc
end
c.chr if c
ensure
system "stty -raw echo" # turn raw input off
end
end
while true
c = char_if_pressed
puts "[#{c}]" if c
sleep 1
puts "tick"
end
Run Code Online (Sandbox Code Playgroud)
请注意,对于非阻塞版本,您不需要特殊的SIGINT处理程序,因为tty仅在原始模式下短暂停留.
mit*_*mit 13
但是对于某些环境,其他方法不起作用,答案仍然有用.请阅读以下评论.
首先你必须安装highline:
gem install highline
Run Code Online (Sandbox Code Playgroud)
然后尝试高线方法是否适合您:
require "highline/system_extensions"
include HighLine::SystemExtensions
print "Press any key:"
k = get_character
puts k.chr
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24527 次 |
| 最近记录: |