Dieser "idiomatische Block" ist ein zentraler Bestandteil des alltäglichen Ruby und wird häufig in Büchern und Tutorials behandelt. Der Ruby-Informationsabschnitt enthält Links zu nützlichen [Online-] Lernressourcen.
Der idiomatische Weg ist, einen Block zu verwenden:
def x(z)
yield z
end
x(3) {|y| y*y}
Oder vielleicht zu einem Proc konvertiert ; hier zeige ich, dass der "Block", der implizit in einen Proc konvertiert wurde &block
, nur ein weiterer "aufrufbarer" Wert ist:
def x(z, &block)
callback = block
callback.call(z)
end
x(4) {|y| y * y}
(Verwenden Sie das obige Formular nur, um den Block-Now-Proc für die spätere Verwendung oder in anderen Sonderfällen zu speichern, da dadurch Overhead- und Syntaxrauschen hinzugefügt wird.)
Ein Lambda kann jedoch genauso einfach verwendet werden (dies ist jedoch nicht idiomatisch):
def x(z,fn)
fn.call(z)
end
x(5, lambda {|y| y * y})
Während die oben genannten Ansätze können alle einpacken „Aufruf einer Methode“ , wie sie Verschlüsse schaffen, gebundene Methoden können auch als First-Class - aufrufbare Objekte behandelt werden:
class A
def b(z)
z*z
end
end
callable = A.new.method(:b)
callable.call(6)
def x(z,fn)
fn.call(z)
end
x(7, callable)
Außerdem ist es manchmal nützlich, die #send
Methode zu verwenden (insbesondere wenn eine Methode namentlich bekannt ist). Hier wird ein Zwischenmethodenobjekt gespeichert, das im letzten Beispiel erstellt wurde. Ruby ist ein System zur Nachrichtenübermittlung:
def x(z, a):
a.__send__(:b, z)
end
x(8, A.new)
Viel Spaß beim Codieren!