0Pricing
Ruby Academy · レッスン

include と extend

振る舞いをミックスインします。

「include と extend」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

振る舞いのミックスイン

モジュールの本当の力は、継承を使わずにクラス間でメソッドを共有するミックスインにあります。主なツールはincludeとextendです。

module Walkable
  def walk
    "#{name} is walking"
  end
end
class Person
  include Walkable
  attr_reader :name
  def initialize(name)
    @name = name
  end
end
puts Person.new("Ada").walk

includeでインスタンスメソッドを追加する

includeは、モジュールのメソッドをインスタンスメソッドとして取り込みます。そのクラスのすべてのオブジェクトがそれらを利用できるようになります。

module Sayable
  def say(msg)
    "#{msg}!"
  end
end
class Dog
  include Sayable
end
puts Dog.new.say("Woof")

クラス間で再利用する

1つのモジュールを互いに関係のない複数のクラスにincludeできるため、共通の親クラスがなくても振る舞いを共有できます。

module Timestamped
  def stamp
    "created"
  end
end
class Post; include Timestamped; end
class Comment; include Timestamped; end
puts Post.new.stamp
puts Comment.new.stamp

extendでクラスメソッドを追加する

extendは、モジュールのメソッドをクラスメソッド(クラスオブジェクト自体に対するメソッド)として取り込みます。

module Findable
  def find(id)
    "Finding record #{id}"
  end
end
class User
  extend Findable
end
puts User.find(42)

オブジェクトに対するextend

1つのオブジェクトだけをextendして、そのオブジェクトだけにメソッドを追加することもできます。他のオブジェクトには影響しません。

module Admin
  def privileges
    "all access"
  end
end
user = Object.new
user.extend(Admin)
puts user.privileges

includeとextendの違い

次の違いを覚えておきましょう。

  • include => メソッドはインスタンスメソッドになります。
  • extend => メソッドはクラスまたはオブジェクトのメソッドになります。
module Helper
  def help; "helping"; end
end
class A; include Helper; end
class B; extend Helper; end
puts A.new.help
puts B.help

モジュールからホストのメソッドを利用できる

ミックスインされたメソッドはホストオブジェクトのコンテキストで実行されるため、ホスト自身のメソッドを呼び出したり、データにアクセスしたりできます。

module Describable
  def describe
    "I am #{role}"
  end
end
class Worker
  include Describable
  def role; "a worker"; end
end
puts Worker.new.describe

includedフック

self.included(base)を定義すると、モジュールがincludeされたときにコードを自動的に実行できます。よく使われるパターンでは、同時にクラスメソッドも追加します。

module Trackable
  def self.included(base)
    puts "Trackable added to #{base}"
  end
end
class Order
  include Trackable
end

所属を確認する

is_a?とancestorsを使うと、includeされたモジュールがオブジェクトの型の継承チェーンに含まれていることを確認できます。

module Flyable; end
class Bird; include Flyable; end
b = Bird.new
puts b.is_a?(Flyable)
p Bird.ancestors

複数のミックスインを組み合わせる

クラスには複数のモジュールをincludeできるため、小さく特化した複数の要素から振る舞いを組み立てられます。

module Swimmable; def swim; "swimming"; end; end
module Runnable; def run; "running"; end; end
class Athlete
  include Swimmable
  include Runnable
end
a = Athlete.new
puts a.swim
puts a.run

まとめ

ミックスインを使うと、柔軟に振る舞いを共有できます。

  • インスタンスメソッドにはincludeを使用します。
  • クラスまたは単一オブジェクトのメソッドにはextendを使用します。
  • ミックスインされたメソッドはホストのコンテキストで実行されます。
  • 小さなモジュールを複数組み合わせられます。
module Greet
  def hi; "hi from #{self.class}"; end
end
class Cat; include Greet; end
puts Cat.new.hi

理解度チェック

includeとextendについての理解度を確認しましょう。

振り返り

ミックスインについて学んだことを振り返りましょう。

  • include => インスタンスメソッドになります。
  • extend => クラスまたは単一オブジェクトのメソッドになります。
  • ミックスインされたメソッドはホストのコンテキストで実行されます。
  • includedフックはinclude時に実行されます。
module Loud
  def shout(s); s.upcase; end
end
class Speaker; include Loud; end
puts Speaker.new.shout("hello")

よくある質問

「include と extend」レッスンは無料ですか?

はい。「include と extend」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「include と extend」で何を学びますか?

振る舞いをミックスインします。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「include と extend」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. モジュールの定義
  2. include と extend
  3. Comparable と Enumerable
  4. prepend とメソッド探索
← Ruby Academyに戻る