2014-02-11 3 views
0

가 나는 인스턴스 메서드 가능한가 내가 모듈에서이 방법모듈에서 인스턴스 메소드를 덮어 쓸 수 있습니까?

class Foo 
    class << self 
    def some_static_method 
     puts 'some_static_method' 
    end 
    end 
end 

module BAR 
    class << Foo 
    def some_static_method 
     puts 'another_static_method' 
    end 
    end 
end 

class Foo 
    include BAR 
end 

Foo.some_static_method # => 'another_static_method' 

를 클래스 메소드를 덮어 쓸 수 있습니다, 알아?

+0

[여기] (http://stackoverflow.com/questions/5944278/overriding-method-by-another-defined-in-module) 정보를 찾을 수 있습니다. – maxdec

답변

1

당신은 다음을 수행 할 수 있습니다

class Foo 
    def some_instance_method; puts "Hello from Foo" end 
end 

module Bar 
    def self.included(base) 
    base.class_eval do 
    def some_instance_method; puts "Hello from Bar" end 
    end 
    end 
end 

class Foo 
    include Bar 
end 

Foo.new.some_instance_method 
+0

클래스 메서드를 덮어 쓰는 것이 더 우아한 방법입니다. 그래서, Foo 클래스의 인스턴스 메소드는 어떻습니까? –

+0

업데이트 된 답변보기 –

1

귀하의 질문은 실제로 약되지 않습니다 :

class Foo 
    def self.some_static_method; puts "Hello from Foo" end 
end 

module Bar 
    def self.included(base) 
    base.instance_eval do 
    def some_static_method; puts "Hello from Bar" end 
    end 
    end 
end 

class Foo 
    include Bar 
end 

Foo.some_static_method 

가 UPDATE

가 인스턴스 메소드의 사용을 무시하려면 작동합니다 메소드 재정의. 그것은 모듈 본체의 class ... 구성 내에서 어떤 클래스가 참조되는지에 관한 것입니다.

class << Foo가 사전에 정의되지 않은 클래스 Foo의 직접 싱글 톤 클래스를 정의 할 수 없기 때문에 메인 환경에서 Foo의 싱글 톤 클래스에

module Bar 
    class << Foo 
    p self 
    end 
end 
# => #<Class:Foo> 

<< Foo 점을 수행 할 때. 따라서 이미 정의 된 Foo을 찾아 주 환경에서 찾을 수 있습니다.

당신이

module Bar 
    class Foo 
    p self 
    end 
end 
# => Bar::Foo 

Bar::Foo이 만든 새로운 종류의 작업을 수행 할 때; Foo은 새로 만든이 Bar::Foo을 가리키며 주 환경의 Foo을 가리 키지 않습니다. 이를 가리 키기 위해 명시 적으로이를 ::으로 지정해야합니다.

module Bar 
    class ::Foo 
    p self 
    end 
end 
# => Foo 
1

Ruby> 2.0.0을 사용하는 경우 Module#prepend을 사용할 수 있습니다. include 대신 prepend 모듈을 사용할 수 있습니다. 그러면 모듈의 모든 메소드가 동일한 이름의 기존 클래스 인스턴스 메소드를 대체합니다. 간단한 예제 here을 볼 수 있습니다.

이전 루비 2, 레일 유사한 해킹을 소개했다 : #alias_method_chain

Here는 두 가지 접근 방식의 좋은 비교입니다.

관련 문제