2016-05-03 16 views
0

Ich versuche, eine Methode zu erstellen, die die Funktionalität von Enumerables sort Methode verwendet.So überschreiben Sie die Sortiermethode Enumerables

Imagine Ich habe diese Daten

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

Ich möchte das Verfahren so nennen können:

data.natural_sort{|a,b| b[:version] <=> a[:version] } 

Der eigentliche Aufruf, die so etwas wie dies würde erreichen passiert:

data.sort{|a,b| MyModule.naturalize_str(b[:version]) <=> MyModule.naturalize_str(a[:version]) } 

Heres mein aktueller gebrochener Code:

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 

Es wirft einen Fehler, weil a und b die Hashes statt der Versionen sind, die ich wollte.

Antwort

3

Sie arbeiten hier mit sich selbst uneins. In Ihrem natural_sort Block erwarten Sie Hash-Objekte, aber innerhalb der Implementierung haben Sie a und b als Strings deklariert.

In Ruby gibt es zwei Möglichkeiten zu sortieren, die sort-Methode mit a,b Paare, und die sort_by-Methode, die eine Zwischenform verwendet, um die Vergleiche zu tun. Der Ansatz sort_by ist normalerweise wesentlich schneller, da er die Transformation einmal auf jedes Objekt anwendet, während die Methode sort dies jedes Mal tut, wenn ein Vergleich durchgeführt wird.

Hier ist ein Rewrite:

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 

Dann können Sie es auf diese Weise nennen:

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

Tatsächlich gibt es nun zwei weitere Möglichkeiten zu sortieren: 'arr.min (arr.size)' und 'arr.min_by (arr.size) {...}'. :-) –

+0

@CarySwoveland Das ist ein Sortier/Abhol-Deal, aber es folgt auch dem gleichen Stil mit einer a/b-Version und einem, der individuelle Transformationen durchführt. – tadman

+0

Ich habe bereits die Methode natural_sort_by, aber ich versuche auch, die Sortiermethode zu implementieren. –

Verwandte Themen