Ruby:如何通过继承挂钩回调

mos*_*shi 5 ruby hook inheritance callback

我在 Ruby 中遇到了一些关于回调(和继承)的问题。这是我的代码:

class Lmao
  def initialize
    @str = "HAHAHAHAHAHHAHAHAH"
    @before_laughing = []
  end

  def self.inherited(base)
    base.extend(Callbacks)
  end

  def laughing
    @before_laughing.each {|method| send(method) }
    @str
  end
end

module Callbacks
  def before_laughing(*methods)
    @before_laughing = methods
  end
end

class Lol < Lmao
  before_laughing :downcase_please

  def downcase_please
    @str.downcase!
  end
end

a = Lol.new
a.laughing # => "HAHAHAHAHAHHAHAHAH"
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我的笑前回调不起作用...因为数组 @before_laughing 是空的。我相信可以通过编辑将 *methods 保存到 Lol 实例方法中的方式(从回调内部)来解决此问题。但我真的不明白如何...

如果您知道解决方案,感谢您的光临!

Jör*_*tag 1

代码中调用了两种不同的实例变量:一种是类实例的实例变量,在的实例方法中初始化为(即空) ,并在的实例方法中读取。但是,由于该实例变量写入的唯一位置是初始值设定项,因此它将始终为空。@before_laughingLmao[]ArrayLmaoinitializeLmaolaughingArray

另一个实例变量是Lol类对象本身的实例变量,它被设置到方法Array [:downcase_please]的内部before_laughing。然而,这篇文章永远不会被阅读