Ten "idiomatyczny blok" jest bardzo podstawową częścią codziennej Ruby i jest często omawiany w książkach i tutorialach. The Ruby information section zawiera linki do przydatnych zasobów edukacyjnych [online].
idiomatycznym sposobem jest wykorzystanie bloku:
def x(z)
yield z # perhaps used in conjunction with #block_given?
end
x(3) {|y| y*y} # => 9
Albo przetwarzany na Proc; tutaj pokazuję, że „blok”, przekształcony w Proc niejawnie z &block
, jest tylko kolejnym „wymagalne” wartość:
def x(z, &block)
callback = block
callback.call(z)
end
# look familiar?
x(4) {|y| y * y} # => 16
(używać tylko powyższy formularz, by zapisać blok-now-Proc do późniejszego wykorzystania lub w innych szczególnych przypadkach, jak dodaje napowietrznych i hałas składnia)
jednak lambda można używać równie łatwo (ale to nie jest idiomatyczne).
def x(z,fn)
fn.call(z)
end
# just use a lambda (closure)
x(5, lambda {|y| y * y}) # => 25
Choć powyższe podejścia mogą wszystko okład "wywołanie a Metoda”, jako że tworzenie zamknięcia związany Methods mogą być również traktowane jako pierwszorzędnych płatnych na żądanie obiektów:
class A
def b(z)
z*z
end
end
callable = A.new.method(:b)
callable.call(6) # => 36
# and since it's just a value...
def x(z,fn)
fn.call(z)
end
x(7, callable) # => 49
Ponadto, czasami użyteczne do stosowania metody #send
(w szczególności jeśli sposób jest znany z nazwy). Tutaj zapisuje obiekt obiektu pośredniego, który został utworzony w ostatnim przykładzie; Ruby to system przesyłania wiadomości:
# Using A from previous
def x(z, a):
a.__send__(:b, z)
end
x(8, A.new) # => 64
Szczęśliwe kodowanie!
Może to być przydatne: https://github.com/krisleech/wisper – Kris