Module

ドキュメント:

class Module | Ruby リファレンスマニュアル [公式]

使い方

  • ミックスインとして使う (インスタンスメソッド及びクラスメソッドを注入する)
  • 名前空間としての役割 (同じ名前のメソッドが作用する範囲や動作を区別する)

参考:

Ruby の Module の使い方とはいったい – Qiita

モジュールで名前空間とミックスインを覚える! | エンジニアライブログ

モジュールとクラスと名前空間 | @katzchang.contexts

モジュールとミックスイン | プロナビ

Ruby のモジュールを名前空間で使っているのか Mix-in で使っているのか – スタック・オーバーフロー

クラスの拡張

参考:

ruby の require/include/extend/継承/クラス拡張ミックスインまとめ | A Life on Rails

クラスの拡張 | Ruby アソシエーション

他のクラスを拡張するいろんな方法 – Qiita

ダブルコロンでのトップレベルの参照と局所的なクラス拡張 – Qiita

名前空間

参考:

ころんころんの話をしよう/もしくはモジュールの名前空間について – Qiita

Ruby におけるダブルコロンについてのメモ – Qiita

Ruby でクラス名のはじめに :: (コロンを2つ) をつけるとそのクラスの絶対的な位置表現をすることができる | コード日進月歩

Ruby におけるスコープのおはなし | hp12c

Ruby の名前空間とレキシカルスコープについて簡潔に説明する – Qiita

Rails のダブルコロンについて – teratail

ruby でクラス名の先頭に :: がつくときの意味について – スタック・オーバーフロー

What is Ruby’s double-colon `::`? – Stack Overflow

How to access the base namespace in Ruby? – Stack Overflow

Ruby, how to reference Root namespace? – Stack Overflow

モジュールに各種メソッドを定義する

  • def self.module_method ... end特異メソッドを定義する
  • class << self ... end特異クラス内でメソッドを定義する → 特異メソッドになる
  • extend self自身で extend する → 全インスタンスメソッドを特異メソッドとしても使えるようにする
  • module_functionモジュール関数として宣言する

参考:

Ruby のモジュールメソッドの作り方 – Qiita

モジュール関数 (module_function)

メソッドをモジュール関数にする。

module_function :foo, :bar, :bazCode language: Ruby (ruby)
モジュール関数の用途
  • モジュール外で特異メソッドとして使用するMod.foo
  • モジュール内でプライベートメソッドとして使用するfoo

ミックスインした場合に、インスタンスメソッドとしては使用はできない。

module Mixin
  def foo; true; end
  module_function :foo
end

class A
  include Mixin
end

A.new.foo
# => NoMethodError: private method `foo' called for #<A:0x00001234xxxxabcd>Code language: Ruby (ruby)

参考:

Ruby のモジュール関数を理解しよう! | hp12c

モジュールを関数のように使う | Ruby 入門

Ruby のモジュールメソッドの呼び出し方法 – Qiita

Ruby のモジュールメソッドの作り方 – Qiita

module_function でモジュールの特異メソッドを簡潔に書く | TechRacho

module_function について | Secret Garden

module_function と extend self – Qiita

Ruby の Module#module_function の使い道が良く分かりません – QA@IT

Module#module_function | Ruby リファレンスマニュアル [公式]

モジュール関数に別名を付ける

先に別名を定義し、それぞれをモジュール関数として宣言する。

module M
  def foo
    p "foo"
  end

  alias bar foo
  module_function :foo, :bar
end

M.foo  # => "foo"
M.bar  # => "foo"Code language: Ruby (ruby)

モジュール関数をミックスインで使う

public として宣言するとミックスインしたクラスのインスタンスで使用できる。

module A
  def module_method; true; end
  module_function :module_method
  public :module_method
end

class B
  include A
end

B.new.module_method
# => trueCode language: Ruby (ruby)

参考:

Ruby の module メソッドの呼び出し方法 – Qiita

モジュール関数からプライベートメソッドを呼び出す

参考:

module_function, invoking module’s private method, invoked in class method style on module shows error – Stack Overflow

文字列またはシンボルから定数を得る

MyModule.const_get(:CONSTANT)Code language: Ruby (ruby)

参考:

クラス名の文字列からクラスを取得する方法 | present

Module#const_get | Ruby リファレンスマニュアル [公式]

constants

定義済みの定数を列挙する。

mod.constantsCode language: Ruby (ruby)

参考:

Module.constants | Ruby リファレンスマニュアル [公式]

name

モジュールやクラスの名前を文字列で返す。

MyModule.name
# => "MyModule"Code language: Ruby (ruby)

参考:

Module#inspect | Ruby リファレンスマニュアル [公式]

メソッドのオーバーライド

参考:

Override module method from another module – Stack Overflow

method_defined?

参考:

Module#method_defined? | Ruby リファレンスマニュアル [公式]

include したモジュールに定数を引き継ぐ

参考:

Scope of Constants in Ruby Modules – Stack Overflow

Module.new

参考:

Module.new | Ruby リファレンスマニュアル [公式]

Module.nesting

参考:

Module.nesting | Ruby リファレンスマニュアル [公式]

as_namespace

プライベートメソッドもしくはプライベート定数としてモジュールの別名を定義する。

リポジトリ:

kitaro-tn/as_namespace: Omit the Ruby Name Space by Defining in the Class – GitHub

参考:

名前空間の省略に include を使いたくなかった | のんびり SE の議事録

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA