параметры поиска определены в self.regexp
метод complete
, кажется, возвращает все различные флаги.
Метод self.regexp
определяет используемый поисковый запрос
class OptionParser
module Completion
def self.regexp(key, icase)
Regexp.new('\A' + Regexp.quote(key).gsub(/\w+\b/, '\&\w*'), icase)
end
end
end
Регулярное выражение построено со следующими флагами
\A
поиск изначало строки
\w*
поиск любого из подходящих символов
candidate
итерации с использованием объекта метода &method(:each)
передается как proc
с &
.method object
вызывается для Completion
класса.
candidates = candidate(key, icase, pat, &method(:each)).sort_by {|k, v, kn| kn.size}
блока iterates
внутри self.candidate
def self.candidate(key, icase = false, pat = nil, &block)
pat ||= Completion.regexp(key, icase)
candidates = []
block.call do |k, *v|
// Search and add candidates
end
candidates
end
Прогон iterator
следующая проверка для each
записи.У меня до сих пор нет 100% понимания этой проверки, я отвечаю за поиск флагов.
block.call do |k, *v|
(if Regexp === k
kn = ""
k === key
else
kn = defined?(k.id2name) ? k.id2name : k
pat === kn
end) or next
v << k if v.empty?
candidates << [k, v, kn]
end
candidates