Questo "blocco idiomatico" è una parte fondamentale del Ruby quotidiano ed è frequentemente trattato in libri e tutorial. Il numero Ruby information section fornisce collegamenti a risorse di apprendimento [online] utili.
Il modo idiomatica è quello di utilizzare un blocco:
def x(z)
yield z # perhaps used in conjunction with #block_given?
end
x(3) {|y| y*y} # => 9
O forse convertito in un Proc; qui mi dimostrano che il "blocco", convertito in Proc implicitamente con &block
, è solo un altro valore "callable":
def x(z, &block)
callback = block
callback.call(z)
end
# look familiar?
x(4) {|y| y * y} # => 16
(utilizzare solo il modulo qui sopra per salvare il blocco-ora-Proc per un uso successivo o in altri casi particolari in quanto aggiunge in testa e il rumore sintassi)
Tuttavia, un lambda può essere utilizzato altrettanto facilmente (ma questo non è idiomatica):.
def x(z,fn)
fn.call(z)
end
# just use a lambda (closure)
x(5, lambda {|y| y * y}) # => 25
Mentre gli approcci di cui sopra possono tutti involucro "chiamando a Metodo" perché creano chiusure, vincolata Methods può anche essere trattato come prima classe oggetti richiamabili:
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
Inoltre, a volte è utile utilizzare il metodo #send
(in particolare se un metodo è conosciuta con il nome). Qui salva un oggetto Method intermedio creato nell'ultimo esempio; Ruby è un sistema che trasmette messaggi:
# Using A from previous
def x(z, a):
a.__send__(:b, z)
end
x(8, A.new) # => 64
Felice codifica!
Questo potrebbe essere utile: https://github.com/krisleech/wisper – Kris