2012-02-27 2 views

risposta

7

No, non esiste una stenografia per questo. Si potrebbe definire un metodo:

def really_empty?(x) 
    x.strip.empty? 
end 

e utilizzare method:

array.reject(&method(:really_empty?)) 

o utilizzare un lambda:

really_empty = ->(x) { x.strip.empty? } 
array.reject(&really_empty) 

ma io non lo chiamerei uno di quelli meglio a meno che non si dispone di un utilizzare per really_empty? in un numero di punti sufficiente a separare la logica.

Tuttavia, dal momento che si sta utilizzando Rails, si potrebbe utilizzare blank? invece di .strip.empty?:

array.reject(&:blank?) 

noti che nil.blank? è vero che, nil.strip.empty? solo ti porge un'eccezione quindi non sono del tutto equivalenti; tuttavia, probabilmente si desidera rifiutare anche nil s utilizzando blank? potrebbe essere meglio comunque. blank? restituisce anche true per false, {} e [] ma probabilmente non si dispone di quelli nella serie di stringhe.

+1

Si potrebbe anche definire veramente_empty? metodo sulla "classe del contenuto di array" (ad esempio String) e quindi utilizzarlo come metodo vuoto. Non sto consigliando questo, solo dicendo che potresti .. – Johannes

2

Sarebbe molto bello di scrivere quanto sopra come questo, ma non è una sintassi supportata, il modo in cui si vorrebbe metodi catena utilizzando la sintassi to_proc (& :) è in questo modo:

.map(&:strip).reject(&:empty?)

+1

se in tutta la realtà, piuttosto che cercare di catena insieme così, io opterei per usare il tuo esempio originale così com'è. –

+2

Ho appena eseguito un test rapido per interesse e ho scoperto che farlo nel modo originale è due volte più veloce (sul mio sistema) rispetto al doppio modo stenografico (questo ha senso in quanto un altro array temporaneo dovrebbe essere assegnato come parte della 'mappa'). –

+0

Chiamare 'lazy' prima di' map' potrebbe essere d'aiuto per la performance. – michau

1

Puoi farlo con la ampex gemma:

require 'ampex' 
array.reject &X.strip.empty?