[ruby] 클래스와 모듈의 차이점

Java에서 왔으며 이제 Ruby와 더 많은 작업을하고 있습니다.

내가 익숙하지 않은 언어 기능은 module입니다. 나는 정확히 무엇 module이고 언제 사용 하는지 궁금 하며 왜 moduleover를 사용 class합니까?



답변

첫 번째 대답은 좋으며 구조적 대답을 제공하지만 다른 접근 방식은 수행중인 작업에 대해 생각하는 것입니다. 모듈은 여러 클래스에서 사용할 수있는 메소드를 제공하는 것에 관한 것입니다. Rails 앱에서 볼 수 있듯이이를 “라이브러리”로 생각하십시오. 클래스는 객체에 관한 것입니다. 모듈은 기능에 관한 것입니다.

예를 들어 인증 및 권한 부여 시스템이 모듈의 좋은 예입니다. 인증 시스템은 여러 앱 수준 클래스에서 작동하며 (사용자는 인증되고, 세션은 인증을 관리하고, 다른 많은 클래스는 인증 상태에 따라 다르게 작동합니다.) 인증 시스템은 공유 API로 작동합니다.

여러 앱에서 메소드를 공유 할 때 모듈을 사용할 수도 있습니다 (다시 말해서 라이브러리 모델이 좋습니다).


답변

╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ class                     ║ module                          ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated       ║ can *not* be instantiated       ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage         ║ object creation           ║ mixin facility. provide         ║
║               ║                           ║   a namespace.                  ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass    ║ module                    ║ object                          ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods       ║ class methods and         ║ module methods and              ║
║               ║   instance methods        ║   instance methods              ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance   ║ inherits behaviour and can║ No inheritance                  ║
║               ║   be base for inheritance ║                                 ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion     ║ cannot be included        ║ can be included in classes and  ║
║               ║                           ║   modules by using the include  ║
║               ║                           ║   command (includes all         ║
║               ║                           ║   instance methods as instance  ║
║               ║                           ║   methods in a class/module)    ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension     ║ can not extend with       ║ module can extend instance by   ║
║               ║   extend command          ║   using extend command (extends ║
║               ║   (only with inheritance) ║   given instance with singleton ║
║               ║                           ║   methods from module)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝


답변

아직 아무도이 말을하지 않은 것에 놀랐습니다.

asker는 Java 배경에서 나왔으므로 (그리고 나도 마찬가지), 여기에 도움이되는 비유가 있습니다.

클래스는 단순히 Java 클래스와 같습니다.

모듈은 Java 정적 클래스와 같습니다. Math자바 클래스를 생각하십시오 . 인스턴스화하지 않고 정적 클래스 (예 :)의 메소드를 재사용합니다 Math.random().


답변

기본적으로 모듈을 인스턴스화 할 수 없습니다. 클래스에 모듈이 포함되면 모든 모듈 메소드와 클래스 메소드에 대한 액세스를 제공하는 프록시 수퍼 클래스가 생성됩니다.

모듈은 여러 클래스로 포함될 수 있습니다. 모듈은 상속 될 수 없지만이 “mixin”모델은 유용한 유형의 “다중 상속”을 제공합니다. OO 순수 주의자들은 그 진술에 동의하지 않지만, 순결이 일을 끝내는 것을 방해하지는 않을 것이다.


(이 답변은 원래에 연결 http://www.rubycentral.com/pickaxe/classes.html되었지만 해당 링크 및 해당 도메인은 더 이상 활성화되어 있지 않습니다.)


답변

Module루비에서 어느 정도는 Java 추상 클래스에 해당합니다. 인스턴스 메소드가 있으며 클래스는 클래스 메소드를 상속 할 수 있지만 ( include루비 녀석은이를 “믹싱”이라고 함) 인스턴스는 없습니다. 다른 사소한 차이가 있지만이 많은 정보는 시작하기에 충분합니다.


답변

네임 스페이스 : 모듈은 네임 스페이스입니다 … Java에는 존재하지 않습니다.)

또한 Java와 Python에서 Ruby로 전환했는데 정확히 같은 질문이 있었음을 기억합니다 …

따라서 가장 간단한 대답은 모듈이 네임 스페이스이며 Java에는 존재하지 않는다는 것입니다. 자바에서 네임 스페이스에 가장 가까운 사고 방식은 패키지 입니다.

그래서 루비의 모듈은 java의
클래스 와 같습니다 : class? 어떤
인터페이스를하지? 어떤
추상 클래스하지? 어떤
패키지 없다? 예 (아마도)

자바 클래스 내부의 정적 메소드 : 루비의 모듈 내부 메소드와 동일

자바에서 최소 단위는 클래스이므로 클래스 외부에서는 함수를 가질 수 없습니다. 그러나 루비에서는 (파이썬과 같이) 가능합니다.

그렇다면 모듈은 무엇입니까?
클래스, 메소드, 상수. 모듈은 해당 네임 스페이스 아래에서이를 보호합니다.

인스턴스 없음 : 모듈을 사용하여 인스턴스를 만들 수 없음

혼합 기능 : 때로는 상속 모델이 클래스에는 좋지 않지만 기능면에서 클래스 / 메소드 / 상수 세트를 그룹화하려고합니다.

루비의 모듈에 대한 규칙 :
-모듈 이름은 UpperCamelCase입니다
-모듈 내의 상수는 모두 CAPS입니다 (이 규칙은 모듈에 한정되지 않은 모든 루비 상수에 대해 동일합니다)
-액세스 방법 : use. 연산자
-상수 액세스 : use :: symbol

모듈의 간단한 예 :

module MySampleModule
  CONST1 = "some constant"

  def self.method_one(arg1)
    arg1 + 2
  end
end

모듈 내에서 메소드를 사용하는 방법 :

puts MySampleModule.method_one(1) # prints: 3

모듈 상수를 사용하는 방법 :

puts MySampleModule::CONST1 # prints: some constant

모듈에 대한 몇 가지 다른 규칙 :
파일에서 하나의 모듈 사용 (예 : 루비 클래스, 루비 파일 당 하나의 클래스)


답변

결론 : 모듈은 정적 / 유틸리티 클래스와 믹스 인 간의 교차입니다.

믹스 인은 재사용이 가능한 “부분”구현으로, 믹스 앤 매치 방식으로 결합 (또는 구성)되어 새로운 클래스를 작성하는 데 도움이됩니다. 이러한 클래스는 물론 자체 상태 및 / 또는 코드를 가질 수 있습니다.