2010-06-27 2 views
6

Ruby에서 Command이라는 특정 유형의 모든 하위 클래스를 찾으려고 노력 중입니다. 다음 코드를 통해 완벽하게 트릭을 수행했지만 실제로 어떻게 작동하는지 이해하지 못합니다. 주로 class << [Subtype] 부품. 이 글을 읽으려고했지만 아직 실종 된 Ruby 마법이 있다고 느낍니다. 누군가가Ruby enum_for confusion

ObjectSpace.enum_for(:each_object, class << Command; self; end).to_a() 

답변

5

class << Command; self; end :-) 나에게 이것을 설명시겠습니까 것은 Command의 싱글 톤 클래스를 반환합니다. 이것은 Command가 유일한 (직접적인) 인스턴스 인 클래스입니다.

루비에서 C의 서브 클래스의 싱글 톤 클래스는 C의 싱글 톤 클래스의 서브 클래스입니다. Command의 모든 하위 클래스에는 Command의 싱글 톤 클래스를 상속 한 싱글 톤 클래스가 있습니다.

ObjectSpace.each_object(C)은 클래스 C 또는 해당 하위 클래스 중 하나의 인스턴스 인 모든 객체에 대해 반복됩니다. 따라서 ObjectSpace.each_object(singleton_class_of_command)을 수행하면 Command와 모든 하위 클래스를 반복합니다.

enum_for 비트는 each_object이 반복되는 모든 요소를 ​​열거하는 Enumerable을 반환하므로 to_a으로 배열로 변환 할 수 있습니다.

+0

멋진 설명, 감사합니다. 따라서 본질적으로 다음과 같습니다. commands = [] ObjectSpace.each_object (class << Command; self; end) {| c | 명령 << c} 지금은 정말 간단 해 보이지만, 나는 그것을 해결할 수 있어야합니다 :) – amarsuperstar