2016-05-03 17 views
-1

Arrayのsort_byメソッドの機能を使用するメソッドを作成しようとしています。Rubyをオーバーライドする方法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]) } 

私の現在の勤務していないコード:

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

ハッシュキーの参照が正しいタイプではありません。 :versionキーを正しく参照するには、x['version']x[:version]に変更することを検討してください。

+0

これはコメントでなければなりません。 –

+0

@WestonGanger No.これは重要なポイントです。質問を明確にすることは、あなたの責任です。 – sawa

関連する問題