Ruby: ¿posible pasar un bloque como parámetro como un bloque real a otra función?

StackOverflow https://stackoverflow.com/questions/2468446

  •  20-09-2019
  •  | 
  •  

Pregunta

Esto es lo que estoy tratando de hacer:

def call_block(in_class = "String", &block)
    instance = eval("#{in_class}.new")
    puts "instance class: #{instance.class}"
    instance.instance_eval{ block.call }
end


# --- TEST EXAMPLE ---
# This outputs "class: String" every time
"sdlkfj".instance_eval {  puts "class: #{self.class}" }

# This will only output "class: Object" every time
# I'm trying to get this to output "class: String" though
call_block("String") { puts "class: #{self.class}" }

En la línea donde dice "instancia.instance_eval {block.call}", estoy tratando de encontrar otra forma de hacer que la nueva variable de instancia ejecute la instancia eval en el bloque. La única forma en que se me ocurre para que lo haga es pasar Instance_Eval el bloque original, no como una variable ni nada, sino como un bloque real como en el ejemplo de prueba.

¿Algun consejo?

¿Fue útil?

Solución

Sí. Puede pasar el bloque al otro método preparando la variable de bloque con un ampers y así:

def foo &blk
  # now, blk is a variable bound to a block object
  bar &blk
end

La razón por la que está obteniendo "clase: objeto" es que Ruby usa el alcance léxico. Esto significa que yo en puts "class: #{self.class}" se refiere a main, el contexto predeterminado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top