Frage

Ich habe mit einem globalen Cache-Modul zu basteln versucht, aber ich kann nicht herausfinden, warum dies nicht funktioniert.

Hat jemand irgendwelche Vorschläge?

Dies ist der Fehler:

NameError: undefined method `get' for module `Cache'
    from (irb):21:in `alias_method'

... durch diesen Code generiert:

module Cache
  def self.get
    puts "original"
  end
end

module Cache
  def self.get_modified
    puts "New get"
  end
end

def peek_a_boo
  Cache.module_eval do
    # make :get_not_modified
    alias_method :get_not_modified, :get
    alias_method :get, :get_modified
  end

  Cache.get

  Cache.module_eval do
    alias_method :get, :get_not_modified
  end
end

# test first round
peek_a_boo

# test second round
peek_a_boo
War es hilfreich?

Lösung

Die Aufrufe alias_method versuchen auf Beispiel: Methoden zu bedienen. Es gibt keine Instanz-Methode get in Ihrem Cache Modul mit dem Namen, so ist es nicht.

Weil Sie alias wollen Klasse Methoden (Methoden auf der Metaklasse von Cache), würden Sie so etwas wie zu tun:

class << Cache  # Change context to metaclass of Cache
  alias_method :get_not_modified, :get
  alias_method :get, :get_modified
end

Cache.get

class << Cache  # Change context to metaclass of Cache
  alias_method :get, :get_not_modified
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top