プロを目指す人のためのRuby入門・第8章重要ポイントまとめ

「プロを目指す人のためのRuby入門」の第8章を読み終わりました

個人的に重要と判断したポイントをまとめます。

モジュールはインスタンスの作成と継承ができない


モジュールとクラスの相違点として、

・モジュールからのインスタンスの作成ができない
・他のモジュールやクラスを継承できない
という2点が挙げられます

module Sample1
end

#モジュールからインスタンスは作成できない
sample = Sample1.new #=> NoMethodError

#他のモジュールを継承できない
module Sample2 < Sample1
end
#=> Syntax Error: syntax error, unexpected '<'


ただし、モジュールに他のモジュールをincludeすることは可能です

module Hello
  def hello
    'hello.'
  end
end

module SprHello
  #モジュールに他のモジュールをincludeする
  include Hello

  def spr_hello
    'こんちゃ!'
  end
end

class User
  include SprHello
end

user = User.new
user.spr_hello #=> "こんちゃ!"
#SprHelloモジュールにincludeしたHelloモジュールのメソッド呼び出しができる
user.hello #=> "hello."
モジュール内のメソッドを特異メソッドとしてミックスインする

extendを使うことで、得意メソッドとしてミックスインすることができます

#モジュールの定義はincludeの時と同じ
module Loggable
  def log(text)
    puts "[LOG] #{text}"
  end  
end

class Product
  #Loggableモジュールのメソッドを特異メソッドとしてミックスインする
  extend Loggable

  def self.create_products(names)
    #logメソッドをクラスの特異メソッド内で呼び出す
    log 'create_products is called.'
  end
end

Product.create_products([]) #=> [LOG] create_products is called.

#productクラスの特異メソッドとして直接呼び出すことも可能
Product.log('Hello.') #=> [LOG] Hello.

感想
自分で作成したクラスにEnumerableモジュールをincludeしてみようと思ったのですが、eachメソッドの実装方法で詰まってできませんでした…
公式リファレンス読んで実装してみたいです!