2
1

More than 1 year has passed since last update.

Ruby モジュールとは

Posted at

PHPerがRuby on Railsを書くことになったので、備忘録として
PHPをやってきて、モジュールという概念を知らなかったので

モジュールの書き方

module.rb
module モジュール名
  処理
end

モジュール名は必ず英数字の大文字で始める

モジュールとクラスの違い

・モジュールはインスタンスを作れない
・モジュールは継承できない

モジュールを使う目的

・名前空間の提供
・インスタンスメソッドとして取り込む(Mix-in)
・モジュールをオブジェクトに取り込む(extend)
・モジュール関数

モジュールを使った名前空間の提供

Ruby on Railsのコードを見ていて、この使い方が一番多いのかなという印象
PHPでいうところの名前空間(namespace)と同じ使われ方

呼び出しは ::演算子を使い、モジュール名::モジュール名 またはモジュール名::クラス名 のように使う

インスタンスメソッドとして取り込む(Mix-in)

PHPでいうところのtrait?
Rubyは多重継承を許さず、Mix-inという仕組みを用意している
Mix-inを使ってincludeされたモジュールのメソッドは、クラスのインスタンスメソッドになる。

Human.rb
module PerfectHuman
  def walk
    puts "歩く"
  end
end

module SwimmingHuman
  def swim
    puts "泳ぐ"
  end
end

class Human
  include PerfectHuman, SwimmingHuman
end

obj = Human.new

obj.walk
#=> 歩く
obj.swim
#=> 泳ぐ

モジュールをオブジェクトに取り込む(extend)

モジュールに定義されたメソッドは、オブジェクトのインスタンスに、特異なメソッドとして取り込むこともできる

Move.rb
module Move
  def walk
    puts "歩く"
  end
end

obj = Object.new
obj.extend Move
obj.puts

クラス定義内でもextendは使用でき、取り込まれたモジュールのメソッドはクラスメソッドになる

Move.rb
module Move
  def walk
    puts "歩く"
  end
end

class Human
  extend Move
end
Human.walk

モジュール関数

Rubyの組み込みモジュールとして定義されているもの。
module_function :メソッド名 と記述される

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1