2009-09-16 2 views

risposta

19

uso sort_by

array.sort_by{|e| e.something}

o

sort_lambda = lambda{|e| e.something} 
array.sort_by(&sort_lambda) 

Con quest'ultimo è possibile riutilizzare sort_lambda in altre dichiarazioni sort_by

5

In Rails, o meglio con ActiveSupport, o in Ruby 1.9 (possibilmente 1.8.7, non è sicuro), è possibile utilizzare la nuova hotness a scelta rapida:

Si noti che sort_by ha effetti secondari possibilmente costosi (e possibilmente vantaggiosi: dipende dalla complessità della chiave di ordinamento): genera e memorizza una coppia chiave-valore temporanea per ciascun elemento in modo che possa essere ordinata dalla nuova chiave. Vedere lo discussion in the documentation per ulteriori informazioni.

+0

Sì, Ruby 1.8.7 ha il simbolo # to_proc. – Chuck

+0

Sarebbe bello se anche array.sort_on (: qualcosa) funzionasse. – tadman

+0

È banale implementare: 'def sort_on (proprietà) sort_by & property end' – Chuck

5

+1 a entrambi suggerimenti Eimantas', ma ho spesso questo venire nei casi in cui ho una classe personalizzata che sempre specie in questo modo, come gli album che dovrebbe ordinare caso insensibile, ignorando la punteggiatura leader e il/un/una. A tale scopo è più efficiente calcolare il valore di ordinamento una volta e quindi ridefinire di conseguenza < =>. Ad es .:

class Album 
def sort_value 
    @sv ||= @name.downcase.sub(/^\W*(the|an|a) /,"") 
    end 

    def <=>(other) 
    sort_value <=> (other.sort_value rescue other) 
    end 
end 
0

Avete preso in considerazione l'inclusione di Paragonabile nella classe per aeb, e solo chiamando sort?