루비 모듈(모듈)
모듈은 메소드, 클래스 및 상수를 결합하는 방법입니다. 모듈은 두 가지 주요 이점을 제공합니다.
모듈은 네임스페이스를 제공하고 이름 충돌을 방지합니다.
모듈은 mixin 장치를 구현합니다.
Module은 샌드박스와 동일한 네임스페이스를 정의합니다. 이 네임스페이스에서는 메서드와 상수가 다른 곳의 메서드 상수와 충돌하지 않습니다.
모듈은 클래스와 유사하지만 한 가지 차이점이 있습니다.
모듈은 인스턴스화할 수 없습니다.
모듈에는 하위 클래스가 없습니다.
모듈은 다른 모듈에 의해서만 정의될 수 있습니다.
Syntax
module Identifier statement1 statement2 ........... end
모듈 상수 명명은 대문자로 시작하는 클래스 상수 명명과 유사합니다. 메소드 정의도 비슷해 보입니다. 모듈 메소드 정의는 클래스 메소드 정의와 유사합니다.
클래스 메소드를 사용하면 모듈 이름과 클래스 메소드 이름 앞에 마침표를 넣어 모듈 메소드를 호출할 수 있고, 모듈 이름과 콜론 두 개를 사용하여 상수를 참조할 수 있습니다.
Instance
#!/usr/bin/ruby # 定义在 trig.rb 文件中的模块 module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end
함수 이름은 같지만 함수가 다른 여러 모듈을 정의할 수 있습니다.
#!/usr/bin/ruby # 定义在 moral.rb 文件中的模块 module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end
클래스 메서드와 마찬가지로 모듈에서 메서드를 정의할 때 마침표와 모듈 이름을 지정할 수 있습니다. 메소드 이름이 뒤에 옵니다.
Ruby require 문
require 문은 C 및 C++의 include 문 및 Java의 import 문과 유사합니다. 타사 프로그램이 정의된 모듈을 사용하려는 경우 간단히 Ruby require 문을 사용하여 모듈 파일을 로드할 수 있습니다.
Syntax
require filename
여기서 파일 확장자 .rb는 필요하지 않습니다.
Example
$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)
여기에서는 $LOAD_PATH << '.'를 사용하여 Ruby가 참조된 파일을 현재 디렉터리에서 검색해야 함을 알립니다. $LOAD_PATH를 사용하지 않으려면 require_relative를 사용하여 상대 디렉터리의 파일을 참조할 수 있습니다.
참고: 여기서 파일에는 동일한 함수 이름이 포함되어 있습니다. 따라서 호출 프로그램을 참조할 때 코드 모호성이 발생하지만 모듈은 이러한 코드 모호성을 방지하고 모듈 이름을 사용하여 적절한 함수를 호출할 수 있습니다.
Ruby include 문
클래스 내에 모듈을 삽입할 수 있습니다. 클래스에 모듈을 포함하려면 클래스에 include 문을 사용할 수 있습니다.
Syntax
include modulename
모듈이 별도의 파일에 정의된 경우 require 문을 사용하여 참조해야 합니다. 모듈을 삽입하기 전의 파일입니다.
Example
support.rb 파일에 다음 모듈이 작성되어 있다고 가정합니다.
module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "You have four weeks in a month" end def Week.weeks_in_year puts "You have 52 weeks in a year" end end
이제 다음과 같이 클래스에서 모듈을 참조할 수 있습니다.
#!/usr/bin/ruby $LOAD_PATH << '.' require "support" class Decade include Week no_of_yrs=10 def no_of_months puts Week::FIRST_DAY number=10*12 puts number end end d1=Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months
이 결과는 다음과 같습니다.
Sunday You have four weeks in a month You have 52 weeks in a year Sunday 120
Mixins in Ruby
이 섹션을 읽기 전에 객체 지향 개념에 대한 사전 이해가 필요합니다. .
클래스가 여러 상위 클래스로부터 클래스의 특성을 상속할 수 있는 경우 해당 클래스는 다중 상속으로 표시됩니다.
Ruby는 다중 상속을 직접 지원하지 않지만 Ruby의 모듈에는 또 다른 마법의 기능이 있습니다. mixin이라는 장치를 제공하여 다중 상속의 필요성을 거의 제거합니다.
Ruby는 실제로 다중 상속 메커니즘을 구현하지 않지만 대신 mixin 기술을 사용합니다. 모듈을 클래스 정의에 포함시킴으로써 모듈의 메소드가 클래스에 혼합됩니다.
믹스인을 자세히 이해하기 위해 아래 예제 코드를 살펴보겠습니다.
module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp=Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
모듈 A는 메소드 a1과 a2로 구성됩니다.
모듈 B는 메소드 b1과 b2로 구성됩니다.
클래스 샘플에는 모듈 A와 B가 포함되어 있습니다.
Class Sample에는 a1, a2, b1 및 b2의 네 가지 메서드 모두에 액세스할 수 있습니다.
Sample 클래스가 두 개의 모듈을 상속한다는 것을 알 수 있습니다. Sample 클래스는 다중 상속 또는 mixin을 사용한다고 말할 수 있습니다.