Ruby: как перехватить обратный вызов через наследование - PullRequest
4 голосов
/ 30 декабря 2010

У меня есть некоторые проблемы с Руби по поводу обратных вызовов (и наследования). Вот мой код:

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"

И как вы можете видеть, мой обратный вызов перед смехом не работает ... потому что массив @before_laughing пуст. Я считаю, что это можно исправить, отредактировав способ сохранения * методов в методе экземпляра Lol (изнутри Callbacks). Но я не понимаю, как ...

Если вы знаете решение, спасибо за ваш свет!

Ответы [ 2 ]

3 голосов
/ 30 декабря 2010

Благодаря Mon_Ouie решение:

class Lmao
  def initialize
    @str = "HAHAHAHAHAHHAHAHAH"
  end

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

  def laughing
    self.class.callbacks_before_laughing.each {|method| send(method) }
    @str
  end
end

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

  def callbacks_before_laughing
    @before_laughing
  end
end

class Lol < Lmao
  before_laughing :downcase_please

  def downcase_please
    @str.downcase!
  end
end

Довольно круто.

1 голос
/ 30 декабря 2010

В вашем коде две различных переменных экземпляра, называемых @before_laughing: одна является переменной экземпляра экземпляров класса Lmao, которая инициализируется как [](т. е. пустой Array) в Lmao initialize методах экземпляра и считывается в Lmao laughing методе экземпляра.Однако, поскольку место only , в которое записывается эта переменная экземпляра, является инициализатором, всегда будет пустым Array.

Другая переменная экземпляра являетсяпеременная экземпляра Lol объекта класса сама , которая устанавливается в Array [:downcase_please] внутри метода before_laughing. Этот один, однако, никогда не получает read .

...