Foo = Class.new
Foo.class_eval do
def class_bar
"class_bar"
end
end
Foo.instance_eval do
def instance_bar
"instance_bar"
end
end
Foo.class_bar #=> undefined method ‘class_bar’ for Foo:Class
Foo.new.class_bar #=> "class_bar"
Foo.instance_bar #=> "instance_bar"
Foo.new.instance_bar #=> undefined method ‘instance_bar’ for #<Foo:0x7dce8>
그냥 메서드의 이름을 기반으로 클래스 메서드를 Foo에 추가하고 instance_eval을 추가하여 Foo에 인스턴스 메서드를 추가 할 수있게 해줄 것으로 기대합니다. 그러나 그들은 그 반대의 것을하는 것처럼 보입니다.class_eval()과 instance_eval()의 차이점을 이해하는 방법은 무엇입니까?
위의 예제에서 Foo 클래스에서 class_bar를 호출하면 정의되지 않은 메서드 오류가 발생하고 Foo.new에서 반환 한 인스턴스에서 instance_bar를 호출하면 정의되지 않은 메서드 오류가 발생합니다. 두 오류 모두 class_eval 및 instance_eval이 수행해야하는 작업을 직관적으로 이해하는 것과 모순되는 것처럼 보입니다.
실제로 이러한 방법의 차이점은 무엇입니까? class_eval위한
문서 :
mod.class_eval (문자열 [파일명 [ LINENO]]) =>
OBJ는 개조의 컨텍스트 문자열 또는 블럭을 평가한다. 이것은 클래스에 메소드를 추가하는 데 사용될 수 있습니다.는 instance_eval에 대한
문서 :
{obj.instance_eval | |
OBJ 블록} => 수신기 (OBJ)의 컨텍스트 내 루비 소스 코드, 또는 소정의 블록, 를 포함하는 문자열을 평가한다. 컨텍스트를 설정하려면 변수 self가 obj로 설정되고 코드가 실행되고 코드 에 obj의 인스턴스 변수에 대한 액세스 권한이 부여됩니다.
이것은 훌륭한 설명입니다. 감사. 나는 마지막 단락까지 계속해서 여러분을 따라갔습니다. 여기서 여러분은 클래스에서 호출 될 때 instance_eval이 클래스 메소드를 정의하는 이유를 설명하려고했습니다. 마지막 줄은 특히 나를 소화하기 어렵습니다. "클래스 메서드를 호출하는 것은 실수입니다. 특정 Class 인스턴스의 인스턴스 메서드입니다." 모든 수업 방법이 그 이상이라는 것을 의미합니까? –
그래, 정확히 - 그게 다야. 나는 내일 더 명확하게하려고 노력할 것이다. – tomafro
환상적 - 방금 문제에 대한 새로운 질문을 추가했습니다. "클래스에서 호출 될 때 instance_eval()이 클래스 메서드를 정의하는 이유는 무엇입니까?" http://stackoverflow.com/questions/900704/why-does-instanceeval-define-a-class-method-when-called-on-a-class. –