2014-12-12 2 views
2

내 관점에서 instance_eval의 경우 클래스 범위는 대상 객체의 고유 클래스라고도하는 싱글 톤 클래스가됩니다. 따라서 객체에 대한 싱글 톤 클래스에서 생성 된 인스턴스 메소드는 해당 객체에 대한 싱글 톤 메소드가됩니다. 나는 다음과 같은 두 가지 코드 조각이 instance_eval모듈이 루비 고유 클래스에 포함

TestClass.instance_eval do 
def class_method2 
    "class_method of TestClass" 
end 
end 

그래서 우리는 TestClass.class_method와의 TestClass를 호출 할 수 있습니다 사용하여 고유 클래스

class TestClass 
    class << self 
    def class_method 
     "class_method of TestClass" 
    end 
    end 
end 

을 사용하여 예상되는 결과

class TestClass; end 

을 생산하는 것을 의미한다. class_method2 및 해당 결과를 가져옵니다. 이제 우리는 고유 클래스에서이 모듈을 포함하는 경우의 그 다음 우리가 TestClass에

class TestClass 
    class << self 
    include TestModule 
    end 
end 

그래서 TestClass.instance_method의 클래스 메소드로 instance_method에 액세스 할 수 있습니다 우리는 이제 모듈 TestModule

module TestModule 
    def instance_method 
    " instance_method from TestModule" 
    end 
end 

가 있다고 가정하자 예상대로 작동합니다. 우리는 다음과 같은 확인 fails.Please이 instance_eval 사용하여 같은 일을 할 경우 그때 나는 다음과 같은 오류를 얻고있다 TestClass.instance_method를 호출했을 때

는 그러나

TestClass.instance_eval do 
    include TestModule 
end 

스 니펫.

ArgumentError: wrong number of arguments(0 for 1) 

는 사람이 문제이며 무엇이 뒤에 내부 로직이 무엇인지 설명 할 것입니다. 당신이 제공 할 수있는 도움에 정말 감사드립니다.

+0

당신은 클래스 메소드에 가져 extend''와'instance_eval'를 사용할 수 있습니다'TestClass.instance_eval 할; TestModule을 확장한다. 결국'TestClass.extend TestModule'과 다르지 않습니다. –

답변

3

당신이 include를 사용하는 경우, 현재 클래스이 무엇인지는 중요하지 않습니다, 이에 self 점을 무엇을 (include 당신이 명시 적 수신기를 지정하지 않은 경우 self 호출하는 방법입니다), 그리고에 때문입니다 당신의 예는, TestClass-self 점, 그래서 TestModule#instance_method는 다음 예에서와 같이, TestClass의 인스턴스 메소드가된다 :

class TestClass 
end 

module TestModule 
    def test_method 
    'test' 
    end 
end 
TestClass.instance_eval { include TestModule } 
TestClass.new.test_method 
# => "test" 
+0

@pramod가 내 답변을 통해 도움을 받았습니까? –

+0

예, 감사합니다. – pramod

관련 문제