2013-08-15 14 views
16

C'è un modo per semplificare il seguente codice?Come trasformare un metodo Ruby in un blocco?

nome file è un elenco di nomi file (stringhe), ad es. [ "Foo.txt", "bar.c", "baz.yaml"]

filenames.map { |f| File.size(f) } 

Esiste un modo per trasformare "File.Size" in un proc o bloccare? Per i metodi su oggetti esistenti, posso fare &:method. C'è qualcosa di analogo per i metodi a livello di modulo?

risposta

22

È possibile utilizzare Object#method(method_name) (anche se per quanto ne so non è idiomatica):

filenames.map(&File.method(:size)) 
+0

Sì .. questo è quello che stavo per dare .. Ma mi hai battuto .. grazie per aver presentato questo .. * + 1 *. –

+0

Interessante, avrei indovinato l'ordine vincolante di "&". – DGM

4
filesize = proc { |f| File.size(f) } 
filenames.map(&filesize) 
+0

+1 Very cool. Perché non ho pensato di farlo? Ora ho un nuovo fantastico trucco per il refactoring. –

+4

Questo non lo semplifica, ma aggiunge ulteriore complessità. –

+2

@ MartinC.Martin In effetti, non lo semplifica. Ma questo è esattamente quello che hai chiesto. Questa risposta trasforma l'espressione in un proc molto semplicemente. Biasima te stesso. È colpa tua, non di Logan. – sawa

4

di stdlib Pathname fornisce un oggetto approccio orientato più a file e directory. Forse c'è un modo per refactoring il tuo filelist, ad es. invece di:

filenames = Dir.entries(".") 
filenames.map { |f| File.size(f) } 

si usa:

require 'pathname' 
filenames = Pathname.new(".").entries 
filenames.map(&:size) 
+2

Grazie, questo risolve il mio problema reale, sebbene non risponda al titolo della domanda. –

Problemi correlati