Ну, для начала, первый бит кода может быть сгенерирован.
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 end
лучше, чем while 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()
метод. Посмотрите, имеет ли это смысл сейчас.