【问题标题】:Search box with Ruby Shoes红宝石鞋的搜索框
【发布时间】:2011-05-17 20:26:32
【问题描述】:

我有一个简短的脚本,它使用正则表达式在文件中搜索用户键入的特定短语。基本上,它是一个简单的搜索框。

我现在正试图让这个搜索框有一个 GUI,这样用户就可以在一个框中输入内容,并让他们的匹配“提醒”他们。

我不熟悉如何详细地使用红宝石鞋,并且一直在使用 TheShoeBox 网站上的示例。

谁能指出我的代码哪里出错了?

这是我的命令行版本:

string = File.read('db.txt')
puts "Enter what you're looking for below"


begin
while(true)
  break if string.empty? 
  print "Search> "; STDOUT.flush; phrase = gets.chop
  break if phrase.empty?
  names = string.split(/\n/)
  matches = names.select { |name| name[/#{phrase}/i] } 
  puts "\n \n"
  puts matches
  puts "\n \n"

   end
end

这是我在 Ruby Shoes 中使用它的尝试:

Shoes.app :title => "Search v0.1", :width => 300, :height => 150 do

string = File.read('db.txt')

    names = string.split(/\n/)
    matches = names.select { |name| name[/#{phrase}/i] } 


def search(text)
    text.tr! "A-Za-z", "N-ZA-Mn-za-m"
end

@usage = <<USAGE
     Search - This will search for the inputted text within the database
USAGE

stack :margin => 10 do 
    para @usage
    @input = edit_box :width => 200
end

flow :margin => 10 do
    button('Search') { @output.matches }

end
    stack(:margin => 0) { @output = para }
end

非常感谢

【问题讨论】:

  • 所以,只要确保这段代码一切正常。例如,phrase 从未声明,但您在此代码中使用它。

标签: ruby regex shoes


【解决方案1】:

好吧,对于初学者来说,第一个代码位可以整理一下。

file = File.open 'db.txt', 'rb'
puts "Enter (regex) search term or quit:"

exit 1 unless file.size > 0
loop do
  puts
  print "query> "
  redo if ( query = gets.chomp ).empty?
  exit 0 if query == "quit"
  file.each_line do |line|
    puts "#{file.lineno}: #{line}" if line =~ /#{query}/i
  end
  file.rewind
end

rb 选项可以让它在 Windows 中按预期工作(尤其是对于 Shoes,您应该尝试独立于平台)。例如,chomp 会去除\r\n\n,但不会去除a,而chop 只是盲目地去除最后一个字符。 loop do endwhile true 好。另外为什么将匹配项存储在变量中?只需逐行阅读文件(允许 CRLF 结尾)而不是按 \n 拆分,尽管剩余的 \r 不会真正造成太大问题...

至于鞋位:

Shoes.app :title => "Search v0.2", :width => 500, :height => 600 do

  @file = File.open 'db.txt', 'rb'

  def search( file, query )
    file.rewind
    file.select {|line| line =~ /#{query}/i }.map {|match| match.chomp }
  end

  stack :margin => 10 do
    @input  = edit_line :width => 400

    button "search" do
      matches = search( @file, @input.text )
      @output.clear
      @output.append do
        matches.empty? ?
          title( "Nothing found :(" ) :
          title( "Results\n" )
      end
      matches.each do |match|
        @output.append { para match }
      end
    end

    @output = stack { title "Search for something." }

  end

end

您从未定义过@output.matches 或调用过您的search() 方法。现在看看是否有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多