0Pricing
Ruby Academy · レッスン

モジュールの定義

名前空間とメソッドです。

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

名前空間とメソッド

モジュールは、メソッドと定数をまとめるコンテナです。クラスとは異なり、モジュールのインスタンスは作成できません。モジュールには、コードをまとめる(名前空間)役割と、振る舞いを共有する(ミックスイン)役割があります。

module Greeter
  def self.hello
    "Hello from the module"
  end
end
puts Greeter.hello

モジュールメソッド

self.を付けてメソッドを定義すると、ユーティリティ関数のようにモジュール上で直接呼び出せます。このようなメソッドは、モジュール関数と呼ばれることがよくあります。

module MathTools
  def self.square(x)
    x * x
  end
end
puts MathTools.square(7)

モジュール定数

モジュールには定数も保持できます。スコープ演算子::を使ってアクセスします。

module Physics
  GRAVITY = 9.81
end
puts Physics::GRAVITY

クラスの名前空間化

クラスをモジュールで包むと、名前の衝突を防げます。完全修飾名には::を使用します。

module Store
  class Item
    def initialize(name)
      @name = name
    end
    def to_s
      @name
    end
  end
end
puts Store::Item.new("Book")

名前空間が重要な理由

2つのライブラリがどちらもLoggerを定義しているかもしれません。名前空間を使えば、Audio::LoggerとNetwork::Loggerのように分離でき、決して衝突しません。

module Audio
  class Logger
    def name; "audio logger"; end
  end
end
module Network
  class Logger
    def name; "network logger"; end
  end
end
puts Audio::Logger.new.name
puts Network::Logger.new.name

module_function

module_functionを使うと、後続のメソッドをモジュール上でも、ミックスインしたときのプライベートなインスタンスメソッドとしても呼び出せるようになります。self.を繰り返し記述せずに済みます。

module Calc
  module_function
  def add(a, b)
    a + b
  end
end
puts Calc.add(2, 3)

関連する定数をまとめる

モジュールは、関連する設定値を1つの分かりやすい名前の下に整理するのに適しています。

module Color
  RED = "#FF0000"
  GREEN = "#00FF00"
  BLUE = "#0000FF"
end
puts Color::GREEN

ネストしたモジュール

モジュールは別のモジュールの中にネストして、さらに整理できます。

module App
  module Config
    VERSION = "1.0"
  end
end
puts App::Config::VERSION

モジュールの内容を一覧表示する

リフレクションメソッドを使うと、実行時にモジュールの定数やメソッドを調べられます。

module Settings
  WIDTH = 80
  HEIGHT = 24
end
p Settings.constants

モジュールはインスタンス化できない

名前付きモジュールに対してModule.newを実行しようとしても失敗します。モジュールにはインスタンス用のコンストラクタがないためです。モジュールは名前空間および振る舞いの入れ物であり、オブジェクトの設計図ではありません。

module Tools
end
begin
  Tools.new
rescue NoMethodError => e
  puts "Cannot instantiate: #{e.message}"
end

まとめ

モジュールはコードを整理し、共有するために使います。

  • self.methodを使って呼び出し可能なモジュール関数を定義します。
  • ::でアクセスする定数を保持します。
  • クラスを名前空間化して衝突を防ぎます。
  • モジュールをインスタンス化することはできません。
module Geometry
  PI = 3.14159
  def self.circle_area(r)
    PI * r * r
  end
end
puts Geometry.circle_area(2)

理解度チェック

モジュールについての理解度を確認しましょう。

振り返り

モジュールの定義について学んだことを振り返りましょう。

  • モジュールはメソッドと定数をまとめます。
  • self.methodで呼び出し可能なモジュール関数を定義します。
  • ::で定数やネストしたクラスにアクセスします。
  • 名前空間化によって名前の衝突を防ぎます。
module Util
  def self.shout(s)
    s.upcase + "!"
  end
end
puts Util.shout("ruby")

よくある質問

「モジュールの定義」レッスンは無料ですか?

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

「モジュールの定義」で何を学びますか?

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

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

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

「モジュールの定義」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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