2010-05-27 2 views
13

나는 글로벌 캐시 모듈을 고치려고 노력했지만, 왜 이것이 작동하지 않는지 알 수 없다.alias_method와 class_methods가 섞이지 않습니까?

누구에게 의견이 있습니까?

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

...이 코드에 의해 생성 : alias_method

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 

답변

17

통화가 예를 방법에서 작동하려고 시도합니다

는 오류입니다. get이라는 인스턴스 메서드가 Cache 모듈에 없으므로 실패합니다. 당신이 클래스의 별명 싶기 때문에

방법 (Cache의 메타 클래스에 메소드), 당신은 같은 것을해야 할 것입니다 : 당신은 전체`Cache.module_eval 할 클래스가 필요하지 않습니다

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

을 < Chuck

+0

@Chuck, 좋은 지적; 업데이트되었습니다! – molf

관련 문제