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").walkincludeでインスタンスメソッドを追加する
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.stampextendでクラスメソッドを追加する
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.privilegesincludeと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.describeincludedフック
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- モジュールの定義
- include と extend
- Comparable と Enumerable
- prepend とメソッド探索