Domanda

Ho cercato di armeggiare con un modulo di cache globale, ma non riesco a capire perché questo non sta funzionando.

Qualcuno ha qualche suggerimento?

Questo è l'errore:

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

... generata da questo codice:

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
È stato utile?

Soluzione

Le chiamate verso alias_method tenterà di operare su esempio metodi. Non esiste un metodo istanza denominata get nel vostro modulo Cache, così fallisce.

Perché si vuole alias class Metodi (metodi sul metaclasse di Cache), che avrebbe dovuto fare qualcosa di simile:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top