구리의 창고

Ruby - module 그리고 include, extend 설명 본문

Ruby

Ruby - module 그리고 include, extend 설명

구리z 2017. 9. 4. 12:36

소개

Ruby에는 Mixin 구현을 위한 module이란 기능이 있다. 코드를 재활용하거나 큰 코드를 나눠서 구현해 여기 저기에서 필요한 코드를 가져올 때 유용하다. 일반적으로 class에 include 혹은 extend 해서 사용하게 되는데, 어떤 경우에 class method와 instance method가 되는지 코드를 통해 정리해보려고한다.

include

class Bar에 module Foo를 include하면 instance method foo가 된다.
module Foo
  def foo
    puts "method foo"
  end
end

class Bar
  include Foo
end

Bar.new.foo # method foo
Bar.foo # undefined method

extend

class Bar에 module Foo를 extend하면 class method foo가 된다.
module Foo
  def foo
    puts "method foo"
  end
end

class Bar
  extend Foo
end

Bar.foo # foo
Bar.new.foo # undefined method

self in module

보통 class method를 만들기 위해서 self를 사용한다. module 내에서 self를 이용해 method를 선언하고 include 혹은 extend를 하면 class method가 될 것 같지만 그렇게 동작하지 않는다. module method 선언 부에서 사용되는 self는 module자체의 self일 뿐이다. 아래 코드를 보자.
module Foo
  def self.foo
    puts "method foo"
  end
end

class Bar
  include Foo
end

class Baz
  extend Foo
end

Foo.foo # method foo
Bar.foo # undefined method
Baz.foo # undefined method

module 내에 class method를 선언하고 싶으면 아래와 같은 방식으로 선언 할 수 있다.
module Foo
  module ClassMethods
    def bar
      puts 'method bar'
    end
  end

  def self.included(base)
    base.extend(ClassMethods)
  end

  def foo
    puts 'method foo'
  end
end

class Baz
  include Foo
end

Baz.new.foo # method foo
Baz.bar # method bar
Baz.foo # undefined method
Baz.new.bar # undefined method


Comments