Я пытаюсь создать метод, который использует функциональность метода Enumerables sort
.Как переопределить метод сортировки перечислений
Imagine У меня есть эти данные
data = [{project: 'proj', version: '1.1'}, {project: 'proj2', version: '1.11'}, {project: 'proj3', version: '1.2'}]
Я хочу, чтобы иметь возможность вызвать метод как это:
data.natural_sort{|a,b| b[:version] <=> a[:version] }
Фактический вызов, который происходит бы достичь чего-то вроде этого:
data.sort{|a,b| MyModule.naturalize_str(b[:version]) <=> MyModule.naturalize_str(a[:version]) }
Heres мой текущий неработающий код:
Enumerable.module_eval do
def natural_sort(&block)
if !block_given?
block = Proc.new{|a,b| Rearmed.naturalize_str(a[:version]) <=> Rearmed.naturalize_str(b[:version])}
end
sort do |a,b|
a = Rearmed.naturalize_str(a)
b = Rearmed.naturalize_str(b)
block.call(a,b)
end
end
end
Он выдает сообщение об ошибке, поскольку a и b являются хешами вместо тех версий, которые я хотел.
На самом деле, теперь есть еще два способа сортировки: 'arr.min (arr.size)' и 'arr.min_by (arr.size) {...}'. :-) –
@CarySwoveland Это сделка sort/fetch, но она также соответствует тому же стилю с версией a/b и той, которая делает отдельные преобразования. – tadman
У меня уже есть метод natural_sort_by, но я также пытаюсь реализовать метод сортировки. –