Blocs

Definició: un bloc és una peça de codi, similar a una funció anònima. Una funció pot usar un bloc com argument.

# Un iterador senzill cridant el bloc per cada element de l'array
['soy', 'un', 'plátano'].each do |elemento| print elemento, '' end # soy un plátano

# Altre iterador molt usat. El bloc modifica el context on va crea estar creat
fac = 1
1.upto(5) do |i| fac *=i end
fac     # 120

# El resultat del bloc pot ser usat per qui l'usa...
[1,2,3,4,5].map{ |num| num*num}   # [1,4,9,16,25]

# ...y pot usar-se més en un argument
(0..100).inject(0){ |resultat, num| result + num}   #5050

Blocs: sintaxi

# Els blocs són tancats per do || ... end
[1,2,3,4,5].each do |e| puts e end

# o per parèntesi
[1,2,3,4,5].map{ |e| e*e}   #[1,4,9,15,25]

Per convenció:

  • usa do || ... end on les modificacions siguen imporntants
  • y {|| ... } on el valor de retorn siga important

Iteradors

def f(cont, &bloque)
  valor = 1
  1.upto(cont)do |i|
    valor = valor * i
    block.call(i, valor)
  end
end

f(5).do |i, f_i| puts "f(#{i}) = #{f_i}" end
f(1) = 1
f(2) = 2
f(3) = 6
f(4) = 24
f(5) = 120

Bloques: salvant els blocs

class Repetidor
  def initialize(&bloque)
    @bloque = bloque
	@cont = 0
  end

def repetir
  @cont +=1
  @block.call(@cont)
end
end

repetidor = Repetidor.new do |cont| puts " Me has llamdo #{cont} veces" end
3.times do repetidor.repetir end
Me has llamado 1 veces
Me has llamado 2 veces
Me has llamado 3 veces

Font: Ruby en 15 Minutos