eigenclass가 너무 비슷해 보이지만 self.class와 동등하지 않은 이유는 무엇입니까?
어딘가에서 메모를 놓쳤습니다. 이에 대해 설명해 주시기 바랍니다.
객체의 고유 클래스가 다른 이유는 무엇 self.class
입니까?
class Foo
def initialize(symbol)
eigenclass = class << self
self
end
eigenclass.class_eval do
attr_accessor symbol
end
end
end
고유 클래스를 동일시하는 내 논리 열차 class.self
는 다소 간단합니다.
class << self
인스턴스 메서드가 아닌 클래스 메서드를 선언하는 방법입니다. 에 대한 바로 가기 def Foo.bar
입니다.
따라서 클래스 객체에 대한 참조 내에서 반환 self
은 self.class
. 이는 클래스 메서드 / 속성의 정의 를 위해로 class << self
설정 되기 때문 입니다 .self
Foo.class
그냥 헷갈 리나요? 아니면 이것은 루비 메타 프로그래밍의 교활한 속임수입니까?
class << self
클래스 메서드를 선언하는 단순한 방법 이상입니다 (그렇게 사용할 수는 있지만). 아마도 다음과 같은 사용법을 보셨을 것입니다.
class Foo
class << self
def a
print "I could also have been defined as def Foo.a."
end
end
end
이것은 작동하고와 동일 def Foo.a
하지만 작동 방식은 약간 미묘합니다. 비밀은이 self
컨텍스트에서는 Foo
의 고유 한 익명 하위 클래스 인 객체를 참조한다는 것 입니다 Class
. 이 서브 클래스를 Foo
's eigenclass 라고 합니다. 따라서 일반 메서드 호출 구문으로 액세스 할 수있는의 고유 클래스 에서 def a
호출되는 새 메서드를 만듭니다 ..a
Foo
Foo.a
이제 다른 예를 살펴 보겠습니다.
str = "abc"
other_str = "def"
class << str
def frob
return self + "d"
end
end
print str.frob # => "abcd"
print other_str.frob # => raises an exception, 'frob' is not defined on other_str
이 예제는 처음에는 말하기 어려울 수 있지만 마지막 예제와 동일합니다. frob
하지에 정의 된 String
클래스 만의 eigenclass에 str
고유 한 익명의 하위 클래스 String
. 그래서 str
이 frob
방법을, 그러나의 경우 String
일반적으로하지 않습니다. 또한 String 메서드를 재정의 할 수 있습니다 (특정 까다로운 테스트 시나리오에서 매우 유용함).
이제 우리는 당신의 원래 예를 이해할 준비가되었습니다. Foo
의 initialize 메서드 내부 self
는 클래스 Foo
가 아니라의 특정 인스턴스 를 참조 Foo
합니다. 고유 클래스는의 하위 클래스 Foo
이지만 그렇지 않습니다 Foo
. 그렇지 않으면 두 번째 예제에서 본 트릭이 작동하지 않습니다. 따라서 예제를 계속하려면 :
f1 = Foo.new(:weasels)
f2 = Foo.new(:monkeys)
f1.weasels = 4 # Fine
f2.monkeys = 5 # Also ok
print(f1.monkeys) # Doesn't work, f1 doesn't have a 'monkeys' method.
도움이 되었기를 바랍니다.
The simplest answer: the eigenclass can't be instantiated.
class F
def eigen
class << self
self
end
end
end
F.new.eigen.new #=> TypeError: can't create instance of virtual class
Yehuda Katz does a pretty good job of explaining the subtleties in "Metaprogramming in Ruby: It's All About the Self"
'your programing' 카테고리의 다른 글
다양한 노드 유형에 대해 jstree 오른쪽 클릭 컨텍스트 메뉴 구성 (0) | 2020.10.09 |
---|---|
Matplotlib에서 동일한 그림에 여러 함수를 그리는 방법은 무엇입니까? (0) | 2020.10.09 |
CSS : "div"안에 "라벨"과 "입력"을 수직으로 정렬하는 방법은 무엇입니까? (0) | 2020.10.09 |
비 최종 필드의 동기화 (0) | 2020.10.09 |
JDialog를 화면 중앙에 어떻게 배치합니까? (0) | 2020.10.09 |