導入
「飛べる」「泳げる」といった能力は、動物の種類(継承関係)とは別に、いろいろなクラスに共通して持たせたいことがあります。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のような親クラスを継承していませんが、FlyableとSwimmableをincludeすることで、flyとswimの両方が使えるようになっています。- Ruby のクラスは1つの親クラスしか継承できません(単一継承)が、モジュールはいくつでも
includeできます。「継承関係にはないけれど、共通の機能を持たせたい」ときにモジュールが活躍します。
やってみよう
新しいモジュール(例えば Walkable)を作り、別のクラスに include してみましょう。1つのクラスに3つ以上のモジュールを include することもできます。
演習
モジュール Greetable に greet メソッド("こんにちは、#{name}です" を返す)を定義し、Robot クラスで include Greetable してください。Robot は attr_reader :name と initialize(name) を持つようにし、Robot.new("R2").greet を puts で表示してください。
ヒント1を見る
module Greetable def greet "こんにちは、#{name}です" end end のように定義します。
ヒント2を見る
Robot クラスの中で include Greetable を書き忘れないようにしましょう。