Ruby - possible de passer un bloc comme param en tant que bloc réel à une autre fonction?

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

  •  20-09-2019
  •  | 
  •  

Question

C'est ce que j'essaie de faire:

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

Sur la ligne où il indique "instance.instance_eval {block.call}", j'essaie de trouver un autre moyen de faire de la nouvelle instance d'instance d'évaluation sur le bloc. La seule façon de penser à le faire est de passer instance_eval le bloc d'origine, non pas comme une variable ou quoi que ce soit, mais comme un vrai bloc comme dans l'exemple de test.

Des conseils?

Était-ce utile?

La solution

Oui. Vous pouvez passer le bloc à l'autre méthode en ajoutant la variable de bloc avec une ampère et ainsi:

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

La raison pour laquelle vous obtenez "Class: Object" est que Ruby utilise la portée lexicale. Cela signifie que vous-même dans puts "class: #{self.class}" fait référence à main, le contexte par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top