Sé que puedo definir dinámicamente métodos en una clase usando define_method
, y que especifico los parámetros que toma este método usando la aridad del bloque.¿Puedo definir dinámicamente un método de Ruby que tome un bloque?
Quiero definir dinámicamente un método que acepte tanto parámetros opcionales como un bloque. En Ruby 1.9, esto es fácil porque ahora se permite pasar un bloque a un bloque.
Desafortunadamente, Ruby 1.8 no permite esto, por lo que el siguiente no funcionará:
#Ruby 1.8
class X
define_method :foo do |bar, &baz|
puts bar
baz.call if block_given?
end
end
x = X.new
x.foo("foo") { puts "called!"} #=> LocalJumpError: no block given
Sustitución de la explícita block.call
con yield
no soluciona el problema.
Desafortunadamente, la actualización a Ruby 1.9 no es una opción para mí. ¿Es este un problema difícil de resolver, o hay una forma de evitarlo?
¿Es necesario pasar una cadena para class_eval? ¿No puedo pasar un bloque, lo que mantendría el alcance? – andrewdotnich
@andrewdotnich Bien, entonces vuelves al problema de cómo vas a definir el método dinámicamente. –
https://github.com/agrimm/zombie-chaser/blob/master/lib/zombie-chaser/chaser.rb tiene un ejemplo y un enlace a una publicación de blog a la mitad del archivo. –