2013-08-15 14 views
16

Czy istnieje sposób na uproszczenie następującego kodu?Jak zmienić metodę Ruby w blok?

nazwy plików to lista nazw plików (ciągi), np. [ "Foo.txt", "bar.c", "baz.yaml"]

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

Czy jest jakiś sposób, aby włączyć "File.size" w proc lub zablokować? W przypadku metod na istniejących obiektach mogę wykonać &:method. Czy jest coś analogicznego dla metod na poziomie modułu?

Odpowiedz

22

Można użyć Object#method(method_name) (chociaż AFAIK nie jest idiomatyczne):

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

Tak .. to jest ten, który miałem dać .. Ale pokonałeś mnie .. dzięki za przedstawienie tego .. * + 1 *. –

+0

Interesujące, źle bym pomyślał o wiążącej kolejności "&". – DGM

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

+1 bardzo fajne. Dlaczego nie myślałem o tym? Teraz mam świetną nową sztuczkę refaktoryzacji. –

+4

To nie upraszcza, ale dodaje dodatkowej złożoności. –

+2

@ MartinC.Martin Rzeczywiście, nie upraszcza to. Ale o to właśnie prosiłeś. Ta odpowiedź zamienia wyrażenie w proc bardzo prosto. Obwiniaj się. To twoja wina, a nie Logana. – sawa

4

stdlib na Pathname zapewnia bardziej obiektowego podejścia do plików i katalogów. Być może istnieje sposób na refaktoryzację swojego filelist, np. zamiast:

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

użyłbyś:

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

Dzięki, to rozwiązuje mój rzeczywisty problem, chociaż nie odpowiada na pytanie. –

Powiązane problemy