Ruby-모듈 및 믹스 인
모듈은 메서드, 클래스 및 상수를 함께 그룹화하는 방법입니다. 모듈은 두 가지 주요 이점을 제공합니다.
모듈은 네임 스페이스를 제공하고 이름 충돌을 방지합니다.
모듈은 믹스 인 기능을 구현합니다 .
모듈은 네임 스페이스, 즉 다른 메서드 및 상수에 의해 밟히는 것에 대해 걱정할 필요없이 메서드와 상수를 재생할 수있는 샌드 박스를 정의합니다.
통사론
module Identifier
statement1
statement2
...........
end
모듈 상수는 클래스 상수와 같이 이름이 처음 대문자로 지정됩니다. 메서드 정의도 비슷해 보입니다. 모듈 메서드는 클래스 메서드처럼 정의됩니다.
클래스 메서드와 마찬가지로 이름 앞에 모듈 이름과 마침표를 추가하여 모듈 메서드를 호출하고 모듈 이름과 두 개의 콜론을 사용하여 상수를 참조합니다.
예
#!/usr/bin/ruby
# Module defined in trig.rb file
module Trig
PI = 3.141592654
def Trig.sin(x)
# ..
end
def Trig.cos(x)
# ..
end
end
함수 이름은 같지만 기능은 다른 모듈을 하나 더 정의 할 수 있습니다.
#!/usr/bin/ruby
# Module defined in moral.rb file
module Moral
VERY_BAD = 0
BAD = 1
def Moral.sin(badness)
# ...
end
end
클래스 메서드와 마찬가지로 모듈에서 메서드를 정의 할 때마다 모듈 이름과 점, 메서드 이름을 차례로 지정합니다.
Ruby require 문
require 문은 C 및 C ++의 include 문과 Java의 import 문과 유사합니다. 세 번째 프로그램이 정의 된 모듈을 사용하려면 Ruby require 문을 사용하여 모듈 파일을로드하면됩니다 .
통사론
require filename
여기서는 줄 필요가 없습니다 .rb 확장자와 파일 이름.
예
$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 상대 디렉토리의 파일을 포함합니다.
IMPORTANT− 여기에서 두 파일 모두 동일한 함수 이름을 포함합니다. 따라서 호출 프로그램에 포함하는 동안 코드가 모호해 지지만 모듈은이 코드 모호성을 피하고 모듈 이름을 사용하여 적절한 함수를 호출 할 수 있습니다.
Ruby include 문
클래스에 모듈을 포함 할 수 있습니다. 클래스에 모듈을 포함하려면 클래스에서 include 문 을 사용합니다.
통사론
include modulename
모듈이 별도의 파일에 정의 된 경우 클래스에 모듈을 포함하기 전에 require 문을 사용하여 해당 파일을 포함해야합니다 .
예
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
Ruby의 믹스 인
이 섹션을 진행하기 전에 객체 지향 개념에 대한 지식이 있다고 가정합니다.
클래스가 둘 이상의 상위 클래스에서 기능을 상속 할 수있는 경우 클래스는 다중 상속을 표시해야합니다.
Ruby는 다중 상속을 직접 지원하지 않지만 Ruby 모듈은 또 다른 멋진 용도가 있습니다. 한 번에 여러 상속의 필요성을 거의 제거하여 mixin 이라는 기능을 제공합니다 .
Mixins는 클래스에 기능을 추가하는 훌륭하게 제어 된 방법을 제공합니다. 그러나 믹스 인의 코드가이를 사용하는 클래스의 코드와 상호 작용하기 시작할 때 진정한 힘이 나옵니다.
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 메소드로 구성됩니다. Sample 클래스는 모듈 A와 B를 모두 포함합니다. Sample 클래스는 a1, a2, b1 및 b2의 네 가지 메서드에 모두 액세스 할 수 있습니다. 따라서 Sample 클래스가 두 모듈 모두에서 상속됨을 알 수 있습니다. 따라서 Sample 클래스가 다중 상속 또는 mixin을 보여 준다고 말할 수 있습니다 .