本文へスキップ
BecomeCoder

Rubyコース · 第8章 実践とこれから · レッスン35

モジュールとMix-in ― includeで機能を共有する

ブラウザで完結

導入

「飛べる」「泳げる」といった能力は、動物の種類(継承関係)とは別に、いろいろなクラスに共通して持たせたいことがあります。Ruby では継承の代わりにモジュールを使って、クラスに機能を「混ぜ込む」ことができます。これをMix-inと呼びます。

説明

module モジュール名 ... end でモジュールを定義し、クラスの中で include モジュール名 すると、モジュールのメソッドがそのクラスで使えるようになります。

module Flyable
  def fly
    "#{name}が飛んでいます"
  end
end

module Swimmable
  def swim
    "#{name}が泳いでいます"
  end
end

class Duck
  include Flyable
  include Swimmable
  attr_reader :name

  def initialize(name)
    @name = name
  end
end

donald = Duck.new("ドナルド")
puts donald.fly
puts donald.swim
  • Duck クラスは Animal のような親クラスを継承していませんが、FlyableSwimmableinclude することで、flyswim の両方が使えるようになっています。
  • Ruby のクラスは1つの親クラスしか継承できません(単一継承)が、モジュールはいくつでも include できます。「継承関係にはないけれど、共通の機能を持たせたい」ときにモジュールが活躍します。

やってみよう

新しいモジュール(例えば Walkable)を作り、別のクラスに include してみましょう。1つのクラスに3つ以上のモジュールを include することもできます。

演習

モジュール Greetablegreet メソッド("こんにちは、#{name}です" を返す)を定義し、Robot クラスで include Greetable してください。Robotattr_reader :nameinitialize(name) を持つようにし、Robot.new("R2").greetputs で表示してください。

ヒント1を見る

module Greetable def greet "こんにちは、#{name}です" end end のように定義します。

ヒント2を見る

Robot クラスの中で include Greetable を書き忘れないようにしましょう。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。