2011-11-01 1 views

답변

1

예, 기본적으로 모듈에서 중첩과 같습니다. 중첩 된 클래스는 중첩 된 클래스와 특별한 관계가 없습니다.

2

이것은 실제로 irb를 실행하고 시도해야하는 경우 중 하나입니다.

예, 클래스는 다른 클래스에서 정의 할 수 있습니다. 클래스의 수퍼 클래스는 모듈 (즉, 클래스 확장 모듈)이므로 모듈에서 할 수있는 거의 모든 것을 수행 할 수 있습니다. 주목할만한 예외는 당신이 include (mixin) 클래스가 될 수 없다는 것입니다.

즉, 실제로이 디자인 패턴을 사용할만한 이유는 거의 없습니다. A와 B가 형제로 간주 될 가능성이 큽니다. 얼굴이 파란색 일 때까지 임의로 네임 스페이스를 지정할 필요가 없습니다. 3 단계 이상이라면 리팩토링을 중단하고 고려하십시오.

이 예를 들어, 더 나은 디자인 패턴은 수 있습니다 :

module Animals 
    class Dog 
    include Walking 
    end 

    module Walking 
    # some methods pertaining to the ability to walk 
    end 
end 
+1

당신의 대답은 잘이에 관심이 설계 문제의 사람이 예상을 질문은 아마도 생각해야하지만, afaict 질문에 직접 대답하지 않습니다. 고의로 도메인 특정 물건에 대한 내 질문을 순수하게 기술적 인 예/아니오로 만들지 만,이 질문은 여전히이 답변에 대한 답이라고 생각합니다. – mpartel

+0

두 번째 문장의 질문에 직접 답하고 그 이유를 설명합니다. 하지만이 기능을 더 잘 사용하지 않는 이유에 대해 좀 더 많은 배경 지식을 포함하도록 질문을 편집했습니다. – coreyward

+0

다른 클래스에서 클래스를 정의 할 수 있음을 이미 알고있었습니다. 문제는 이것이 모듈 내에서 정의 된 클래스와 정확히 같은 동작을하는지 또는 내부 클래스가 모듈의 클래스에없는 외부 클래스와 특별한 관계가 있는지 여부입니다. 어쩌면 당신은 질문의 첫 번째 문장을 질문으로 착각했을 것입니다. :) 어쨌든 나는 당신의 조언을 이해하고 동의합니다. – mpartel

0

클래스 (및 모듈) 다른 사용법이 있습니다 더 복잡한 뭔가를

module Alphabet 
    class A; end 
    class B; end 
end 

이 사용하여 잘 작동하도록 유지 mixin 계속 :

  • 네임 스페이스 : 다른 클래스 (또는 모듈) 내에 클래스 (또는 모듈)를 정의하면 h 내부 클래스 또는 모듈에 도달하기 위해 정의 클래스 외부의 다른 표기법을 사용합니다.
  • 인스턴스 용 템플릿 : 모듈과 클래스는 완전히 (거의 대부분) 다른 동작을합니다.
  • 상속 : 모듈을 위해 작동하는 모든 속성 및 메소드를 상속 할 수 있도록 클래스를 확장 할 수 있습니다. 또는 메소드 (및 속성)를 범위에 추가하는 모듈 (클래스가 아님)을 포함 할 수 있습니다. Ruby는 클래스 계층 구조의 모듈을 믹스하여 트릭을 재생합니다.

따라서 이름 공간을 사용하는 맥락에서 동일합니다. 그러나 나는 항상 모듈을 사용하고 싶지만 더 많은 스타일을 필요로합니다. 이 주제에 관한 가장 좋은 책은 제 의견으로는 "Metaprogramming Ruby"인 Paolo Perrotta입니다.

+0

모듈과 클래스는 클래스를 인스턴스화 할 수 있다는 점을 제외하고는 다른 동작을하지 않습니다. * Metaprogramming Ruby *는 좋은 책이지만 다른 독해력을주기를 원할 수도 있습니다. – coreyward

1

예 및 아니요. 클래스는 할 수있는 반면 모듈을 인스턴스화 할 수 없으므로 클래스 내에 중첩 된 클래스를 사용하는 것과 모듈 내에 클래스를 중첩하는 것과 차이가 있습니다.

예 : 모듈을 인스턴스화 할 수 없기 때문에 여기 Ford 객체 (즉, Cobra, F-150, Mustang 등)를 인스턴스화 할 수 없습니다.

  `module Ford 
      class Engine 
       ... 
      end 
      end` 

하지만 은과 같이 중첩 된 클래스를 사용과 클래스 포드의 예뿐만 아니라 포드 엔진의 인스턴스 수 있습니다 :

 `class Ford 
      class Engine 
      @@actions = ['list', 'find', 'add', 'quit'] 
      def self.actions; @@actions; end 
      end 

      def self.truck_exists? 
      #Some more stuff here 
      end 
     end`