루비 모듈(모듈)


모듈은 메소드, 클래스 및 상수를 결합하는 방법입니다. 모듈은 두 가지 주요 이점을 제공합니다.

  • 모듈은 네임스페이스를 제공하고 이름 충돌을 방지합니다.

  • 모듈은 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을 사용한다고 말할 수 있습니다.