Ruby - possible de passer un bloc comme param en tant que bloc réel à une autre fonction?
-
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?
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