2016-05-03 3 views
0

Я пытаюсь создать метод, который использует функциональность метода 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 являются хешами вместо тех версий, которые я хотел.

ответ

3

Вы здесь работаете с вами. В вашем блоке natural_sort вы ожидаете объекты хэша, но в рамках реализации вы явно лидировали a и b как строки.

В Ruby существует два способа сортировки: метод sort с парами a,b и метод sort_by, который использует промежуточную сортировку для выполнения сравнений. Подход sort_by обычно значительно быстрее, поскольку он применяет преобразование к каждому объекту один раз, а метод sort делает это каждый раз, когда выполняется сравнение.

Вот переписан:

def natural_sort_by(&block) 
    if (block_given?) 
    sort_by do |o| 
     Rearmed.naturalize_str(yield(o)) 
    end 
    else 
    sort_by do |o| 
     Rearmed.naturalize_str(o) 
    end 
    end 
end 

Тогда вы можете назвать это так:

data.natural_sort_by { |o| o[:version] } 
+0

На самом деле, теперь есть еще два способа сортировки: 'arr.min (arr.size)' и 'arr.min_by (arr.size) {...}'. :-) –

+0

@CarySwoveland Это сделка sort/fetch, но она также соответствует тому же стилю с версией a/b и той, которая делает отдельные преобразования. – tadman

+0

У меня уже есть метод natural_sort_by, но я также пытаюсь реализовать метод сортировки. –

Смежные вопросы