Ruby LanguageBlocchi e Procs e Lambdas


Sintassi

  • Proc.new ( blocco )
  • lambda {| args | codice }
  • -> (arg1, arg2) {codice}
  • object.to_proc
  • {| single_arg | codice }
  • do | arg, (chiave, valore) | codice fine

Osservazioni

Fai attenzione alla precedenza degli operatori quando hai una linea con più metodi concatenati, come:

str = "abcdefg"
puts str.gsub(/./) do |match|
  rand(2).zero? ? match.upcase : match.downcase
end

Invece di stampare qualcosa come abCDeFg , come ci si aspetterebbe, stampa qualcosa come #<Enumerator:0x00000000af42b28> - questo perché do ... end ha una precedenza inferiore rispetto ai metodi, il che significa che gsub vede solo l'argomento /./ e non l'argomento del blocco. Restituisce un enumeratore. Il blocco finisce per passare a puts , che lo ignora e mostra solo il risultato di gsub(/./) .

Per risolvere questo problema, gsub racchiudere la chiamata gsub tra parentesi o usare { ... } .

Blocchi e Procs e Lambdas Esempi correlati