2016-05-03 4 views
-1

Я пытаюсь создать метод, который использует функциональность метода Array sort_by.Ruby как переопределить ruby ​​sort_by

Imagine У меня есть эти данные

data_array = [{project: 'proj', version: '1.1'}, {project: 'proj2', version: '1.11'}, {project: 'proj3', version: '1.2'}] 

Я хочу, чтобы иметь возможность вызвать метод как это:

data_array.natural_sort_by{|x| x[:version] } 

Фактический вызов, который происходит бы достичь чего-то вроде этого:

data_array.sort_by{|x| MyModule.naturalize_str(x[:version]) } 

Heres my current unworking code:

Array.module_eval do 
    def natural_sort_by(&block) 
    sort_by{|x| Rearmed.naturalize_str(eval(block))} 
    end 
end 

Я не совсем уверен, как этого добиться.

+0

вы знаете о [Enumerable] (http://ruby-doc.org/core-2.3.1/Enumerable.html) модуля ли? –

+0

Да, да. Сначала мне нужно было решить основную проблему. Я, вероятно, доберусь туда, хотя я не знаю, что это применимо ко всем Enumerable. –

ответ

4
class Array 
    def natural_sort_by 
    sort_by{|x| MyModule.naturalize_str(yield(x))} 
    end 
end 

или

class Array 
    def natural_sort_by &block 
    sort_by{|x| MyModule.naturalize_str(block.call(x))} 
    end 
end 
+0

Красота! Я наконец понимаю, как работает блок. –

0

Ссылки на хеш-ключи не имеют нужного типа. Подумайте об изменении этого x['version'] на x[:version], чтобы правильно указать ключ :version.

+0

Это должен быть комментарий, а не ответ –

+0

@WestonGanger No. Это важный момент. Вы несете ответственность за разъяснение этого вопроса. – sawa

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