Переменная name
недоступна внутри области определения класса (class << self
).Это не выдает NameError, потому что вы переопределили method_missing
.
Чтобы сделать то, что вы пытаетесь сделать, вам нужно сохранить область действия с name
.Чтобы сделать это, вы должны использовать только блочные методы (например, class_eval
) вместо прямого открытия класса, так что-то вроде этого:
def method_missing(meth,*args,&block)
name = meth.to_s
eigenclass = class << self; self; end
eigenclass.class_eval do
define_method(name) do
puts "hello " + name
end
end
end
Но на самом деле символ в meth
вполне достаточно - вам не нужно имя вообще.(Хотя вам все равно понадобится описанная выше техника в любом случае.) Кроме того, вы хотите немедленно запустить метод.Самый простой способ - отправить сообщение:
def method_missing(meth,*args,&block)
eigenclass = class << self; self; end
eigenclass.class_eval do
define_method(meth) do
puts "hello #{meth}"
end
end
send(meth, *args, &block)
end