2009-08-28 15 views
43

Chcę utworzyć filtr i być w stanie zastosować go do tablicy lub hasza. Na przykład:Jak utworzyć blok wielokrotnego użytku/proc/lambda w Ruby?

def isodd(i) 
    i % 2 == 1 
end 

I chcą, aby móc używać go tak:

x = [1,2,3,4] 
puts x.select(isodd) 
x.delete_if(isodd) 
puts x 

Wydaje się, że powinna być prosta, ale nie mogę dowiedzieć się, co trzeba zrobić to działa.

Odpowiedz

68

Tworzenie lambda a następnie przekonwertować do bloku z operatorem &:

isodd = lambda { |i| i % 2 == 1 } 
[1,2,3,4].select(&isodd) 
+3

Możesz również użyć operatora "nożnych lambda", aby utworzyć wolnostojący proces. Zobacz http://stackoverflow.com/questions/9340117/what-is-the-stab-operator-in-ruby. Dostępne od 'ruby 1.9'. Oczywiście, czysto kwestia gustu i stylu kodowania :) – zealoushacker

+0

dla tych, którzy czytają w przyszłości, można również stworzyć lambdas w ten sposób: lambda_name = ->() {stawia "cześć świat"} – BKSpurgeon

18

można utworzyć nazwie Proc i przekazać je do metod, które mają bloki:

isodd = Proc.new { |i| i % 2 == 1 } 
x = [1,2,3,4] 
x.select(&isodd) # returns [1,3] 

& operator konwertuje między Proc/lambda i blokiem, co jest oczekiwane przez metody takie jak: select.

27
puts x.select(&method(:isodd)) 
+0

Odpowiedzi Dave'a i Daniela są również dobre. To jest alternatywa. –

+2

+1 Odpowiedź jest przydatna, gdy masz istniejącą metodę, której nie chcesz przepisywać jako lambda/proc. Działa również wtedy, gdy trzeba wywołać metodę na konkretnym obiekcie: 'x.select (& obj.method (: isodd))' – Kelvin

+0

miło i to poprawnie odpowiada na postawione pytanie - oni chcieli wiedzieć, jak zawinąć istniejące metodę i przekazać ją jako proc – Dan

Powiązane problemy