내 관점에서 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)
는 사람이 문제이며 무엇이 뒤에 내부 로직이 무엇인지 설명 할 것입니다. 당신이 제공 할 수있는 도움에 정말 감사드립니다.
당신은 클래스 메소드에 가져 extend''와'instance_eval'를 사용할 수 있습니다'TestClass.instance_eval 할; TestModule을 확장한다. 결국'TestClass.extend TestModule'과 다르지 않습니다. –