#17 Rubyで学ぶモジュールとパッケージの基本
Rubyのファイル整理は「モジュール」という仕組みが中心で、クラスとは少し違う役割を持っています。この記事では、Rubyにおけるモジュールの基本と、ミックスインという応用的な使い方までを解説します。
ファイルを分けて読み込む
# utils.rb
def greet(name)
puts "こんにちは、#{name}さん"
end
# main.rb
require_relative 'utils'
greet("太郎")
`require_relative`は、今いるファイルから見た相対パスで別のファイルを読み込む書き方です。gemなど外部ライブラリを読み込む場合は、相対パスを使わない`require`を使います。
moduleという仕組み
Rubyの`module`は、関連する機能をひとまとめにする点でクラスに似ていますが、インスタンスを作ることはできません。名前の衝突を防ぐための「名前空間」として使われることが多い機能です。
module Utils
def self.greet(name)
puts "こんにちは、#{name}さん"
end
end
Utils.greet("太郎")
大きなアプリでは、`module Shop; class Order; end; end`のようにモジュールをネストさせ、`Shop::Order`という形でクラス名を管理することもあります。同じ「Order」という名前のクラスが別の場所にあっても、名前空間が違えば衝突しません。
ミックスインという使い方
Rubyの`module`は、クラスに機能を「混ぜ込む」(ミックスイン)という、Rubyらしい応用的な使い方もできます。`include`を使うと、モジュールに定義したメソッドをそのクラスのインスタンスメソッドとして使えるようになります。
module Greetable
def greet
puts "こんにちは、#{name}さん"
end
end
class User
include Greetable
attr_reader :name
def initialize(name)
@name = name
end
end
User.new("太郎").greet
Rubyには1つのクラスしか継承できない(多重継承ができない)という制約がありますが、モジュールは複数`include`できるため、継承階層を複雑にせずに複数の機能をクラスへ追加する手段としてよく使われます。似た仕組みに`extend`があり、こちらはインスタンスメソッドではなく、クラスメソッドとして機能を追加したい場合に使います。
Rubyならではの注意点
最初はファイル分割や名前空間としての役割から理解し、慣れてきたらミックスインという発展的な使い方も学んでいくとよいでしょう。`module_function`というキーワードを使うと、`self.`を毎回付けなくてもモジュール関数として定義できる書き方もあり、標準ライブラリの`Math`モジュールなどで実際に使われています。
まとめ
Rubyのファイル整理は`require_relative`で読み込み、`module`で名前空間を作ります。`include`によるミックスインは、多重継承ができないRubyで複数の機能をクラスに持たせるための重要な手法なので、クラスとの違いとあわせて意識しておきましょう。
本ページはプロモーションを含みます。
参考書籍(PR)
Rubyをもっと学びたい方には「プロを目指す人のためのRuby入門[改訂2版]」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿