Я не понимаю, почему вы думаете, что это будет неэффективно. Предсказания о таких вещах общеизвестно ненадежны, вы должны решить, что это слишком медленно, прежде чем вы наклонитесь назад, чтобы найти более быстрый путь. И затем вы должны профилировать его, чтобы убедиться, что именно в этом и заключается проблема (кстати, в среднем увеличение скорости в 3-4 раза от переключения на 1,9)
В любом случае, это должно быть довольно легко сделать, что-то вроде:
class Globber
def self.parse_to_regex(str)
escaped = Regexp.escape(str).gsub('\*','.*?')
Regexp.new "^#{escaped}$", Regexp::IGNORECASE
end
def initialize(str)
@regex = self.class.parse_to_regex str
end
def =~(str)
!!(str =~ @regex)
end
end
glob_strs = {
'*hn' => [['john', true, ], ['johnny', false,], ['hanna', false]],
'*hn*' => [['john', true, ], ['johnny', true, ], ['hanna', false]],
'hn' => [['john', false,], ['johnny', false,], ['hanna', false]],
'*h*n*' => [['john', true, ], ['johnny', true, ], ['hanna', true ]],
}
puts glob_strs.all? { |to_glob, examples|
examples.all? do |to_match, expectation|
result = Globber.new(to_glob) =~ to_match
result == expectation
end
}
# >> true