2016-05-03 70 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