如何在一定时间后从 Ruby 中的终端获取字符串?
How do I get a string from the terminal in Ruby after a certain amount of time?
我正在尝试创建一个命令行程序,要求用户输入,但仅在特定时间(例如:5 秒)后才获取字符串。
我目前正在使用 gets.chomp,但这需要 return。
有人知道什么有用的方法吗?
您可以使用标准库中的超时
require "timeout"
def gets_timeout( prompt, secs )
puts
print prompt + "timeout=#{secs}secs]: "
Timeout::timeout( secs ) { gets }
rescue Timeout::Error
puts "*timeout"
nil # return nil if timeout
end
和运行它
2.1.5 :010 > test = gets_timeout('hello',3)
hello[timeout=3secs]: *timeout
=> nil
2.1.5 :011 > test
=> nil
2.1.5 :012 > test = gets_timeout('hello',3)
hello[timeout=3secs]: test
=> "test\n"
2.1.5 :013 > test
=> "test\n"
@danmanstx 的回答帮助我构建了工作示例(我想它会在 Linux/MacOS 上工作):
require "timeout"
def gets_timeout( prompt, secs )
puts
s = ''
print prompt + " [timeout=#{secs}secs]: "
begin
system("stty raw echo")
Timeout::timeout( secs ) { loop { s += STDIN.getc } }
rescue Timeout::Error
puts "*timeout"
ensure
system("stty -raw echo")
puts
puts "We got: [#{s}]"
end
end
gets_timeout('hello',3)
Matz 的额外学分。希望对你有帮助。
我正在尝试创建一个命令行程序,要求用户输入,但仅在特定时间(例如:5 秒)后才获取字符串。
我目前正在使用 gets.chomp,但这需要 return。
有人知道什么有用的方法吗?
您可以使用标准库中的超时
require "timeout"
def gets_timeout( prompt, secs )
puts
print prompt + "timeout=#{secs}secs]: "
Timeout::timeout( secs ) { gets }
rescue Timeout::Error
puts "*timeout"
nil # return nil if timeout
end
和运行它
2.1.5 :010 > test = gets_timeout('hello',3)
hello[timeout=3secs]: *timeout
=> nil
2.1.5 :011 > test
=> nil
2.1.5 :012 > test = gets_timeout('hello',3)
hello[timeout=3secs]: test
=> "test\n"
2.1.5 :013 > test
=> "test\n"
@danmanstx 的回答帮助我构建了工作示例(我想它会在 Linux/MacOS 上工作):
require "timeout"
def gets_timeout( prompt, secs )
puts
s = ''
print prompt + " [timeout=#{secs}secs]: "
begin
system("stty raw echo")
Timeout::timeout( secs ) { loop { s += STDIN.getc } }
rescue Timeout::Error
puts "*timeout"
ensure
system("stty -raw echo")
puts
puts "We got: [#{s}]"
end
end
gets_timeout('hello',3)
Matz 的额外学分。希望对你有帮助。