, 하나Ruby : 모듈의 클래스를 중첩하는 것과 동일한 클래스의 클래스 중첩? 루비
class A
class B
end
end
같은 클래스를 선언하고 있습니다 A::B.new
같이 내부 클래스를 인스턴스화.
B
은 A
(Java의 경우)과 특별한 관계가 있거나 A
의 네임 스페이스입니까? 즉, 모듈에 클래스를 중첩하는 것과 같은 클래스에 클래스를 중첩하는 것입니까?
, 하나Ruby : 모듈의 클래스를 중첩하는 것과 동일한 클래스의 클래스 중첩? 루비
class A
class B
end
end
같은 클래스를 선언하고 있습니다 A::B.new
같이 내부 클래스를 인스턴스화.
B
은 A
(Java의 경우)과 특별한 관계가 있거나 A
의 네임 스페이스입니까? 즉, 모듈에 클래스를 중첩하는 것과 같은 클래스에 클래스를 중첩하는 것입니까?
예, 기본적으로 모듈에서 중첩과 같습니다. 중첩 된 클래스는 중첩 된 클래스와 특별한 관계가 없습니다.
이것은 실제로 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
클래스 (및 모듈) 다른 사용법이 있습니다 더 복잡한 뭔가를
module Alphabet
class A; end
class B; end
end
이 사용하여 잘 작동하도록 유지 mixin 계속 :
따라서 이름 공간을 사용하는 맥락에서 동일합니다. 그러나 나는 항상 모듈을 사용하고 싶지만 더 많은 스타일을 필요로합니다. 이 주제에 관한 가장 좋은 책은 제 의견으로는 "Metaprogramming Ruby"인 Paolo Perrotta입니다.
모듈과 클래스는 클래스를 인스턴스화 할 수 있다는 점을 제외하고는 다른 동작을하지 않습니다. * Metaprogramming Ruby *는 좋은 책이지만 다른 독해력을주기를 원할 수도 있습니다. – coreyward
예 및 아니요. 클래스는 할 수있는 반면 모듈을 인스턴스화 할 수 없으므로 클래스 내에 중첩 된 클래스를 사용하는 것과 모듈 내에 클래스를 중첩하는 것과 차이가 있습니다.
예 : 모듈을 인스턴스화 할 수 없기 때문에 여기 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`
당신의 대답은 잘이에 관심이 설계 문제의 사람이 예상을 질문은 아마도 생각해야하지만, afaict 질문에 직접 대답하지 않습니다. 고의로 도메인 특정 물건에 대한 내 질문을 순수하게 기술적 인 예/아니오로 만들지 만,이 질문은 여전히이 답변에 대한 답이라고 생각합니다. – mpartel
두 번째 문장의 질문에 직접 답하고 그 이유를 설명합니다. 하지만이 기능을 더 잘 사용하지 않는 이유에 대해 좀 더 많은 배경 지식을 포함하도록 질문을 편집했습니다. – coreyward
다른 클래스에서 클래스를 정의 할 수 있음을 이미 알고있었습니다. 문제는 이것이 모듈 내에서 정의 된 클래스와 정확히 같은 동작을하는지 또는 내부 클래스가 모듈의 클래스에없는 외부 클래스와 특별한 관계가 있는지 여부입니다. 어쩌면 당신은 질문의 첫 번째 문장을 질문으로 착각했을 것입니다. :) 어쨌든 나는 당신의 조언을 이해하고 동의합니다. – mpartel