Blocchi, Procs e lambda (di seguito le chiusure in Informatica) sono uno degli aspetti più potenti di Ruby, e anche uno dei più fraintesi . Questo probabilmente perché Ruby gestisce le chiusure in un modo piuttosto unico. Rendere le cose più complicate è che Ruby ha quattro diversi modi di usare chiusure, ognuna delle quali è un po 'diversa, e talvolta senza senso. Ci sono alcuni siti con alcune ottime informazioni su come funzionano le chiusure all'interno di Ruby. Ma devo ancora trovare una buona guida definitiva là fuori.
class Array
def iterate!(&code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array = [1, 2, 3, 4]
array.iterate! do |n|
n ** 2
end
Procedure, AKA, Procs
blocchi sono molto pratico e sintatticamente semplice, ma si può decidere di avere molti blocchi diversi a nostra disposizione e utilizzare loro più volte. Come tale, passare lo stesso blocco ripetutamente ci richiederebbe di ripetere noi stessi. Tuttavia, poiché Ruby è completamente orientato agli oggetti, questo può essere gestito in modo abbastanza pulito salvando il codice riutilizzabile come un oggetto stesso. Questo codice riutilizzabile è chiamato Proc (abbreviazione di procedura). L'unica differenza tra blocchi e Proc è che un blocco è un processo che non può essere salvato e, in quanto tale, è una soluzione monouso. Lavorando con Procs, siamo in grado di iniziare a fare il seguente:
class Array
def iterate!(code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array_1 = [1, 2, 3, 4]
array_2 = [2, 3, 4, 5]
square = Proc.new do |n|
n ** 2
end
lambda
Procs Finora, si è utilizzato in due modi, passandoli direttamente come attributo e salvandoli come variabile. Questi Proc sono molto simili a quelli che altre lingue chiamano funzioni anonime o lambda. Per rendere le cose più interessanti, anche i lambda sono disponibili all'interno di Ruby. Date un'occhiata:
class Array
def iterate!(code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array = [1, 2, 3, 4]
array.iterate!(lambda { |n| n ** 2 })
puts array.inspect
Blocchi
Il più comune, più semplice e probabilmente più “Ruby come” modo di utilizzare le chiusure in Ruby è con i blocchi. Hanno la seguente sintassi familiare:
array = [1, 2, 3, 4]
array.collect! do |n|
n ** 2
end
puts array.inspect
# => [1, 4, 9, 16]
Grazie per questo, davvero utile per me! – duykhoa
Grazie amico - ottimo esempio, ma che senso ha chiamare ispezionare su un Fixnum? – sekmo