像维基百科一样连续输入

Continuous input as in wikipedia

所以我正在学习 ruby 并想从维基百科中删除。

require "rubygems"
require "json"
require 'restclient'
require 'crack'
require 'io/console'


parse = ""
5.times{
    inp = STDIN.getch
    parse += inp
    url="http://en.wikipedia.org/w/api.php?action=opensearch&search=#{parse}&namespace=0"

    data= Crack::JSON.parse(RestClient.get(url))
    puts data[1]
}

因此,我编写的这段代码从用户连接输入并抓取 wiki 搜索解析 JSON 的输出中获取了 5 次输入。但我希望输入是连续的,而不是用户点击一个字符等待输出并再次点击下一个字符。相反,我希望它在不按 enter 的情况下输入几个字符 ,如果有暂停,比如 1 秒或更长时间,它应该开始抓取并给出输出。

背后的一个主要原因是允许用户擦除他写的一些文本或添加更多字母和脚本以再次跟随输入字段中留下的任何内容而无需按回车键 即使它在初始暂停后显示了输出。


基本上我希望它就像 wiki 本身一样。随时可以进入搜索团队修改,随时有新的输出等待。

编辑:

require "rubygems"
require "json"
require 'restclient'
require 'crack'
require 'io/console'

parse=""
ch=""
t2 =Thread.new do
    loop do
        temp=STDIN.getch
        parse+=temp
    end
end

t=Thread.new do
    loop do
        if parse!=ch
            sleep 1
            url="http://en.wikipedia.org/w/api.php?action=opensearch&search=#{parse}&namespace=0"
            data = Crack::JSON.parse(RestClient.get(url))
            #puts parse
            puts data[1]
            ch=parse
        end
    end
end

t.join
t2.join

这非常有效,但我如何在用户按下回车键时结束线程。

getch 实际上需要两个(记录不详的)关键字参数,它们完全符合您的要求

# wait for 0 characters, timeout after 2 seconds
char = STDIN.getch min:0, time:2

如果用户在两秒内没有按任何键,char将是nil。您可以在循环中调用它,并将该结果用作启动抓取的触发器。

require "rubygems"
require "json"
require 'restclient'
require 'crack'
require 'io/console'

parse=""
ch=""
done=false
t2 =Thread.new do
    loop do
        temp=STDIN.getch
        if temp=="\n"
            done=true
            break
        end
        parse+=temp
    end
end

t=Thread.new do
    loop do
        if done==true
            break
        end
        if parse!=ch
            sleep 1
            url="http://en.wikipedia.org/w/api.php?action=opensearch&search=#{parse}&namespace=0"
            data = Crack::JSON.parse(RestClient.get(url))
            #puts parse
            puts data[1]
            ch=parse
        end
    end
end

t.join
t2.join

puts "Thanks!"
gets

使用.chomp,然后它不仅会读取\n,还会读取空格。也只需要 1 个线程,而不是 2 个。

require "json"
require 'restclient'
require 'crack'
require 'io/console'

parse=""
ch=""
done=false

t2 =Thread.new do
    loop do
        temp=STDIN.getch.chomp
        if temp==""
            done=true
            break
        end
        parse+=temp
    end
end

while !done
    if parse!=ch
        sleep 1
        url="http://en.wikipedia.org/w/api.php?action=opensearch&search=#{parse}&namespace=0"
        data = Crack::JSON.parse(RestClient.get(url))
        puts data[1]
        ch=parse
    end
end
t2.join