수색…


통사론

  • 선언

    module Name;
    
        any ruby expressions;
    
    end
    

비고

루비의 모듈 이름은 상수이기 때문에 대문자로 시작해야합니다.

module foo; end # Syntax error: class/module name must be CONSTANT

간단한 mixin 포함

module SomeMixin
  def foo
    puts "foo!"
  end
end

class Bar
  include SomeMixin
  def baz
    puts "baz!"
  end
end

b = Bar.new
b.baz         # => "baz!"
b.foo         # => "foo!"
# works thanks to the mixin

Now Bar 는 자체 방식과 SomeMixin 의 방식을 SomeMixin 입니다.

mixin이 클래스에서 어떻게 사용되는지는 그것이 어떻게 추가되는지에 따라 달라집니다 :

  • include 키워드는 클래스 컨텍스트에서 모듈 코드를 평가합니다 (예 : 메소드 정의는 클래스의 인스턴스에 대한 메소드가됩니다).
  • extend 는 객체의 싱글 톤 클래스의 컨텍스트에서 모듈 코드를 평가합니다 (메서드는 확장 객체에서 직접 사용할 수 있음).

모듈을 네임 스페이스로 사용

모듈은 다른 모듈과 클래스를 포함 할 수 있습니다 :

module Namespace

    module Child

        class Foo; end

    end # module Child

    # Foo can now be accessed as:
    #
    Child::Foo

end # module Namespace

# Foo must now be accessed as:
# 
Namespace::Child::Foo

확장 기능이있는 간단한 믹스 인

mixin은 클래스에 추가 (혼합) 할 수있는 모듈입니다. 이를 수행하는 한 가지 방법은 extends 메소드를 사용하는 것입니다. extend 방법은 클래스 메소드와 믹스 인 방법을 추가한다.

module SomeMixin
  def foo
    puts "foo!"
  end
end

class Bar
  extend SomeMixin
  def baz
    puts "baz!"
  end
end

b = Bar.new
b.baz         # => "baz!"
b.foo         # NoMethodError, as the method was NOT added to the instance
Bar.foo       # => "foo!"
# works only on the class itself 

모듈과 수업 구성

모듈을 사용하여 컴포지션을 통해 더 복잡한 클래스를 작성할 수 있습니다. include ModuleName 지시문은 모듈의 메소드를 클래스에 통합합니다.

module Foo
  def foo_method
    puts 'foo_method called!'
  end
end

module Bar
  def bar_method
    puts 'bar_method called!'
  end
end

class Baz
  include Foo
  include Bar

  def baz_method
    puts 'baz_method called!'
  end  
end

Baz 에는 자체 메소드 외에도 FooBar 메소드가 포함되어 있습니다.

new_baz = Baz.new
new_baz.baz_method #=> 'baz_method called!'
new_baz.bar_method #=> 'bar_method called!'
new_baz.foo_method #=> 'foo_method called!'


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow