2016-05-03 114 views
-1

我想創建一個使用Array的sort_by方法的功能的方法。紅寶石如何覆蓋紅寶石sort_by

可以想象我有這個數據

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]) } 

繼承人我目前的unworking代碼:

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

我不太清楚如何做到這一點。

+0

你知道的[可枚舉(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號這是一個重要的觀點。您有責任明確問題。 – sawa