2010-05-27 14 views
13

Ich habe versucht, mit einem globalen Cache-Modul zu basteln, aber ich kann nicht herausfinden, warum das nicht funktioniert.alias_method und class_methods nicht mischen?

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 

Antwort

17

Die Anrufe zu alias_method versuchen wird, auf Instanz Methoden zu bedienen. Es gibt keine Instanzmethode namens get in Ihrem Cache Modul, so dass es fehlschlägt.

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

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 
+3

Sie brauchen nicht die ganze 'Cache.module_eval Klasse tun < - Sie können einfach 'class << Cache' schreiben. – Chuck

+0

@Chuck, guter Punkt; aktualisiert! – molf