问题描述
|
module EventSubscriber
def method_missing(method_name,*args)
if method_name[/^subscribe_to_(.*)/]
class << self
define_method(method_name) do |*arguments|
# ....
end
end
send(method_name,*args)
else
super
end
end
end
EventSubscriber
是一个模块,可以混入类中以订阅事件。如果调用了称为“ѭ2”的方法,则会对其进行定义(以避免再次产生“ѭ3”的开销),然后再调用该方法。如何将该变量纳入范围?
问题出在单例类内部,method_name
似乎不可访问。 Ruby抱怨一个“未定义的局部变量或方法”。
我知道我可以用self.class.send(:define_method ..)
来做到这一点,但我宁愿不这样做,除非必须这样做。我更喜欢这种格式。
解决方法
如何使用:
module EventSubscriber
extend self
def method_missing(method_name,*args)
if method_name[/^subscribe_to_(.*)/]
class << self
define_method(method_name) do |*arguments|
# ....
end
end
send(method_name,*args)
else
super
end
end
def singleton(obj)
class << obj; self; end
end
end
, 当前的问题是您正在使用class << object
语法来访问singleton类并尝试访问method_name
变量。任何“ 9”陈述都会改变范围;因此,如果未在其中定义4ѭ,则该地方将不存在。
我仍然不确定您到底要完成什么,但是这是我解决您的问题的尝试:
module EventSubscriber
def method_missing(method_name,*args)
if method_name =~ /^subscribe_to_(.+)/
class << self
self
end.define_method(method_name) do |*arguments|
# ....
end
send method_name,*args
else
super
end
end
end
请注意,我还将正则表达式更改为更易于阅读的内容。