我正在查看一些讨论中的代码并偶然发现了这一点,并且想知道为什么 klass = self. 我知道他们是比我更好的 ruby 开发人员,这一定是有充分理由的。
他们为什么不调用 self.remove_from_cache!(message["key"], false)?该块是否创建了一个新范围,其中 self 指的是 MessageBus 类?是否还有其他示例说明您需要在 Ruby 中创建这种类型的构造,或者这是主要的构造?如果 MessageBus.subscribe 是 MessageBus 的一个实例(比如 m_bus.subscribe),是否会在块中自己引用 m_bus?ensure_class_listener 是类方法这一事实对此有什么影响吗?抱歉所有问题,但只是想确定一下。
谢谢
https://github.com/discourse/discourse/blob/master/app/models/site_customization.rb#L118
def self.ensure_cache_listener
unless @subscribed
klass = self
MessageBus.subscribe("/site_customization") do |msg|
message = msg.data
# what would self her refer to
# what would self her refer to
# would self.remove_from_cache!(message["key"], false)
klass.remove_from_cache!(message["key"], false)
end
@subscribed = true
end
end
编辑#1
MessageBus.subscribe 的实现似乎在这里: https ://github.com/SamSaffron/message_bus/blob/master/lib/message_bus.rb#L217