Bloques en Ruby

Se pueden hacer de 2 formas:

  • Por convención, si lo que vamos a ejecutar tiene una sola linea lo meteremos entre llaves:
contactos.each { |key,value| puts "La llave es #{key} y el valor es #{value}"}

 

  • Si tiene mas de una linea, utilizamos do y end
loop do
  puts "QUIERES EJECUTAR OTRO CICLO? s/n"
  respuesta = gets.chomp

  if respuesta == "n"
    break
  end
  puts "Volvemos a otro Ciclo"
end

 

Los parámetros en ambos casos se pueden usar:

7.times { |time|
  puts "hey estoy en la iteracion numero #{time}"
}
7.times do |time|
  puts "Empiezo"
  puts "hey estoy en la iteracion numero #{time}"
  puts "Termino!"
end

 

Pasar un Bloque de Código a una Función o Método

**El yield es para saltar a nuestro bloque de código que nos han pasado. **Como llamar a un callback en Javascript.

  • Sin parámetros:
def saludar
  puts "Hola!!!"
  yield
end

saludar do
  puts "Hola desde nuestro bloque"
end

#RESULTADO:
#Hola!!!
#Hola desde nuestro bloque

 

  • Con Parámetros:
def saludar(nombre)
  puts "Hola #{nombre}!!!"
  yield
end

saludar("Pepe") do
  puts "Hola desde nuestro bloque"
end

#RESULTADO:
#Hola Pepe!!!
#Hola desde nuestro bloque

 

def saludar
  nombre = "Pepe"
  hora = 4
  yield hora,nombre
end


saludar do |hora_cliente, nombre_cliente = "mi niño"|
  puts "Que paso #{nombre_cliente}? Son las #{hora_cliente}"
end

#RESULTADO:
#Que paso Pepe? Son las 4

 

def suma(num1, num2, &block)
  resultado = num1 + num2
  block.call resultado
end


suma(4,8) do |response|
  puts "El resultado de la suma es #{response}"
end

 

Verificar si nos han mandado el bloque de código con block_given?

def suma(num1, num2, &block)
  resultado = num1 + num2
  if block_given?
    block.call resultado
  else
    puts "El Calculo es #{resultado}"
  end

end

suma(4, 8) do |response|
  puts "El Resultado es #{response}"
end                                      
### RESULTADO:
#El Resultado es 12


suma(4, 8)
### RESULTADO:
#El Calculo es 12
def hablar(nombre)
  if block_given?
    yield(nombre)
  else
    "Soy #{nombre} y estoy hablando"
  end
end

puts hablar("Pepe")
puts hablar("Pepe"){|texto| "#{texto} habla lo que yo diga"}

 

 

array_example = ["a", "b", "c"]

array_example.each_index {|index|
  puts ".- #{index}"
}

 

El método delete no devuelve nada si no existe el parametro que buscamos, pero admite que le mandemos una función, para que la ejecute si pasara esto.

array_example = [1, 2, 3]

puts array_example.delete("5") {"no existe"}    #RESULTADO: no existe
puts array_example.delete("5")                  #RESULTADO: (NADA por default)