山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

プロを目指す人のためのRuby入門 その13

第8章 モジュールを理解する

モジュール

モジュールはクラスと違い、モジュールからインスタンスを作成することができないことや、他のモジュールやクラスを継承することができません。

module Loggable
  def log(text)
    puts "[LOG] #{text}"
  end
end

class Book
  # モジュールを include する
  include Loggable

  def title
    log 'Book Title'
  end
end

book = Book.new
book.title

include と extend

いつも忘れるRubyの include, prepend, extend の意味。そしてActiveSupport::Concernについても。 - Qiita

今のところ使い分け方が分かりませんが、覚えておきます。

配列とハッシュをfreezeする

deep_freezable.rb
module DeepFreezable
  def deep_freeze(array_or_hash)
    case array_or_hash
    when Array
      # 配列の各要素をfreeze
      array_or_hash.each do |element|
        element.freeze
      end
    when Hash
      array_or_hash.each do |key, value|
        key.freeze
        value.freeze
      end
    end
    # 配列自身をfreeze
    array_or_hash.freeze
  end
end
team.rb
require './lib/deep_freezable'

class Team
  extend DeepFreezable

  COUNTRIES = deep_freeze(['Japan', 'US', 'India'])
end
bank.rb
require './lib/deep_freezable'

class Bank
  extend DeepFreezable

  CURRENCIES = deep_freeze({ 'Japan' => 'yen', 'US' => 'dollar', 'India' => 'rupee' })
end

配列とハッシュを要素を含めてfreezeするモジュールを作成します。