Ruby - Possível passar um bloco como um param como um bloco real para outra função?

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

  •  20-09-2019
  •  | 
  •  

Pergunta

É isso que estou tentando fazer:

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}" }

Na linha em que diz "Instância.Instance_Eval {Block.Call}", estou tentando encontrar outra maneira de fazer com que a nova Variável Run Instância de Extreme avalie no bloco. A única maneira de pensar em fazer isso é passar no exemplo, o bloco original, não como uma variável ou qualquer coisa, mas como um bloco real, como no exemplo de teste.

Alguma dica?

Foi útil?

Solução

Sim. Você pode passar o bloco para o outro método, antecendendo a variável de bloco com um ampersa e assim:

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

A razão pela qual você está recebendo "Classe: Objeto" é que Ruby usa o escopo lexical. Isso significa que eu em puts "class: #{self.class}" refere-se a main, o contexto padrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top