문제

나는 Java에서 왔고 지금은 Ruby와 더 많은 일을하고 있습니다.

내가 익숙하지 않은 한 가지 언어 기능은 module. 나는 정확히 무엇인지 궁금합니다 module 그리고 언제 하나를 사용하고 왜 module ~ 위로 class?

도움이 되었습니까?

해결책

첫 번째 대답은 좋고 구조적 답변을 제공하지만 또 다른 접근 방식은 당신이하고있는 일에 대해 생각하는 것입니다. 모듈은 여러 클래스에서 사용할 수있는 방법을 제공하는 것입니다.이를 "라이브러리"(레일 앱에서 볼 수 있듯이)로 생각하십시오. 수업은 물체에 관한 것입니다. 모듈은 함수에 관한 것입니다.

예를 들어, 인증 및 인증 시스템은 모듈의 좋은 예입니다. 인증 시스템은 여러 앱 레벨 클래스에서 작동합니다 (사용자는 인증, 세션 관리 인증 관리, 다른 클래스가 인증 상태를 기준으로 다르게 작동 할 수 있으므로 인증 시스템은 공유 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()).

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

여러 클래스에서 모듈을 포함시킬 수 있습니다. 모듈은 상속 될 수 없지만이 "믹스 인"모델은 유용한 유형의 "다중 유전 화"을 제공합니다. Oo Purists는 그 진술에 동의하지 않을 것이지만, 순결이 일을 끝내는 방향으로 나아가지는 않습니다.


(이 답변은 원래 연결되어 있습니다 http://www.rubycentral.com/pickaxe/classes.html, 그러나 그 링크와 그 도메인은 더 이상 활성화되지 않습니다.)

Module 루비에서 어느 정도는 Java에 해당합니다. 초록 수업 - 인스턴스 방법이 있으며 클래스는 그로부터 상속 될 수 있습니다 ( include, Ruby Guys는 그것을 "Mixin"이라고 부르지 만 인스턴스는 없습니다. 다른 사소한 차이점이 있지만이 많은 정보로 인해 시작하기에 충분합니다.

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

나는 또한 Java와 Python에서 Ruby로 전환했습니다. 나는이 같은 질문을 정확히 기억합니다 ...

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

루비의 모듈은 Java의 것과 같습니다.
수업? 아니
상호 작용? 아니
초록 수업? 아니
패키지? 예 (어쩌면)

Java의 클래스 내부 정적 메소드 : Ruby의 모듈 내부의 메소드와 동일합니다.

Java에서 최소 단위는 클래스이며 클래스 외부에서 기능을 가질 수 없습니다. 그러나 루비에서는 이것이 가능합니다 (파이썬과 같은).

그렇다면 모듈에 무엇이 들어가나요?
클래스, 방법, 상수. 모듈은 해당 네임 스페이스 아래에서이를 보호합니다.

인스턴스 없음 : 모듈은 인스턴스를 만드는 데 사용할 수 없습니다

혼합 INS : 때때로 상속 모델은 클래스에 좋지 않지만 기능 측면에서 일련의 클래스/ 방법/ 상수를 함께 그룹화하려고합니다.

루비의 모듈에 대한 규칙 :
- 모듈 이름은 어퍼 카멜 케이스입니다
- 모듈 내의 상수는 모두 캡입니다 (이 규칙은 모듈에만 국한되지 않은 모든 루비 상수에 대해 동일합니다)
- 액세스 방법 : 사용. 운영자
- 액세스 상수 : 사용 :: 기호

모듈의 간단한 예 :

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

모듈에 대한 다른 규칙 :
파일에서 하나의 모듈을 사용합니다 (루비 클래스, 루비 파일 당 하나의 클래스)

결론 : 모듈은 정적/유틸리티 클래스와 믹스 인 사이의 십자가입니다.

Mixins는 새로운 클래스를 작성하는 데 도움이되도록 믹스 앤 매치 방식으로 결합 (또는 구성) 할 수있는 재사용 가능한 "부분적인"구현 조각입니다. 이 클래스는 물론 자체 상태 및/또는 코드를 추가 할 수 있습니다.

수업

클래스를 정의하면 데이터 유형에 대한 청사진을 정의합니다. 클래스 보유 데이터, 해당 데이터와 상호 작용하고 개체를 인스턴스화하는 데 사용되는 방법이 있습니다.

기준 치수

  • 모듈은 방법, 클래스 및 상수를 함께 그룹화하는 방법입니다.

  • 모듈은 두 가지 주요 이점을 제공합니다.

    => 모듈은 네임 스페이스를 제공하고 이름 충돌을 방지합니다. 네임 스페이스는 다른 사람이 작성한 것과 동일한 이름의 함수 및 클래스와의 충돌을 피합니다.

    => 모듈은 믹스 인 시설을 구현합니다.

(Klazz에 모듈을 포함하여 모듈 방법에 대한 Klazz에 액세스 할 수 있습니다.)

(클래스 클래스 클래스 Klazz 방법에 액세스하는 모드로 Klazz를 확장하십시오.)

첫째, 아직 언급되지 않은 일부 유사점. 루비는 오픈 클래스를 지원하지만 모듈도 열려 있습니다. 결국, 클래스 상속 체인의 모듈에서 클래스 상속 및 클래스 및 모듈은 비슷한 동작을 갖습니다.

그러나 프로그래밍 언어로 수업과 모듈을 모두 갖는 목적이 무엇인지 스스로에게 물어봐야합니까? 클래스는 인스턴스를 생성하기위한 청사진이되기위한 것이며 각 인스턴스는 청사진의 실현 된 변형입니다. 인스턴스는 청사진 (클래스)의 실현 된 변형 일뿐입니다. 당연히 클래스는 객체 생성으로 기능합니다. 또한, 우리는 때때로 하나의 청사진이 다른 청사진에서 파생되기를 원하기 때문에, 수업은 상속을 지원하도록 설계되었습니다.

모듈은 인스턴스화 할 수없고, 객체를 생성하지 않으며, 상속을 지원하지 않습니다. 따라서 한 모듈이 다른 모듈로부터 상속되지 않았다는 것을 기억하십시오!

그렇다면 언어로 모듈을 갖는 요점은 무엇입니까? 모듈의 명백한 사용은 네임 스페이스를 만드는 것이며 다른 언어로도 알 수 있습니다. 다시, 루비의 멋진 점은 모듈을 다시 개봉 할 수 있다는 것입니다 (클래스로서). 그리고 이것은 다른 루비 파일에서 네임 스페이스를 재사용하려는 경우 큰 사용법입니다.

module Apple
  def a
    puts 'a'
  end
end

module Apple 
  def b
    puts 'b'
  end
end

class Fruit
  include Apple
end

 > f = Fruit.new
 => #<Fruit:0x007fe90c527c98> 
 > f.a
 => a
 > f.b
 => b

그러나 모듈 사이에는 상속이 없습니다.

module Apple
  module Green
    def green
      puts 'green'
    end
  end
end

class Fruit
  include Apple
end

> f = Fruit.new
 => #<Fruit:0x007fe90c462420> 
> f.green
NoMethodError: undefined method `green' for #<Fruit:0x007fe90c462420>

Apple 모듈은 녹색 모듈의 방법을 상속하지 않았으며 과일 클래스에 Apple을 포함시킬 때 Apple 모듈의 방법은 Apple 모듈의 조상 체인에 추가되지만 녹색 모듈의 방법은 아닙니다. 모듈은 Apple 모듈에 정의되었습니다.

그렇다면 녹색 방법에 어떻게 접근 할 수 있습니까? 수업에 명시 적으로 포함해야합니다.

class Fruit
  include Apple::Green
end
 => Fruit 
 > f.green
=> green

그러나 루비는 모듈에 대한 또 다른 중요한 사용법을 가지고 있습니다. 이것은 믹스 인 시설입니다. 그러나 요약하기 위해 Mixins를 사용하면 상속 체인의 객체 체인으로 방법을 정의 할 수 있습니다. Mixins를 통해 객체 인스턴스의 상속 체인 (포함) 또는 Selfleton_class of Self (Extend)에 메소드를 추가 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top