2012-12-10 16 views
5

Jak możesz przekazać funkcję po nazwie w Ruby? (I już tylko zostały z wykorzystaniem Ruby na kilka godzin, więc jestem nadal zastanawianie rzeczy.)Przekaż funkcję według nazwy w Ruby

nums = [1, 2, 3, 4] 

# This works, but is more verbose than I'd like  
nums.each do |i| 
    puts i 
end 

# In JS, I could just do something like: 
# nums.forEach(console.log) 

# In F#, it would be something like: 
# List.iter nums (printf "%A") 

# In Ruby, I wish I could do something like: 
nums.each puts 

Można to zrobić podobnie zwięźle w Ruby? Czy mogę po prostu odwołać się do funkcji po nazwie, zamiast używać bloku?

Osoby głosujące na zamknięcie: Czy możesz wyjaśnić, dlaczego nie jest to prawdziwe pytanie?

+1

Czy tego właśnie szukasz? http://stackoverflow.com/questions/522720/passing-a-method-as-a-parameter-in-ruby –

Odpowiedz

6

można wykonać następujące czynności:

nums = [1, 2, 3, 4] 
nums.each(&method(:puts)) 

This article ma dobre wyjaśnienie różnic między proca, bloki i lambdas w Ruby.

+0

TO jest fajne. Nie mogę uwierzyć, że nigdy nie widziałem 'i method()'! –

+0

Możliwe jest również określenie metody instancji, np. 'nums.each (& $ stderr.method (: puts))' –

3

Czy mogę po prostu odwołać się do funkcji po nazwie, zamiast owijać ją w blok?

Nie "pakujesz" go - blok jest funkcją.

Jeśli zwięzłość jest problemem, można użyć nawiasów zamiast do..end:

nums.each {|i| puts i} 
0

Nie out-of-the-box, choć można użyć method:

def invoke(enum, meth) 
    enum.each { |e| method(meth).call(e) } 
end 

wolę je opakowane w monkeypatched Enumerable.

Są też inne sposoby, aby temu zaradzić; to rodzaj brutalnej siły.