Module

参考:

class Module (Ruby 2.6.0)

使い方

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

参考:

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

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

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

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

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

クラスの拡張

参考:

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

クラスの拡張 | Ruby アソシエーション (ruby.or.jp)

他のクラスを拡張するいろんな方法 – 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, :baz

モジュール関数の用途

  • モジュール外で特異メソッドとして使用する: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>

参考:

instance method Module#module_function (Ruby 2.5.0)

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

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

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

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

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

module_function について | Secret Garden (Instrumental)

module_function と extend self – Qiita

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

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

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

module M
  def foo
    p "foo"
  end

  alias bar foo
  module_function :foo, :bar
end

M.foo  # => "foo"
M.bar  # => "foo"

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

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
# => true

参考:

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)

参考:

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

instance method Module#const_get (Ruby 2.6.0)

const_get (Module) | Ruby リファレンス (ref.xaio.jp)

constants

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

mod.constants

参考:

singleton method Module.constants (Ruby 2.6.0)

constants (Module) | Ruby リファレンス (ref.xaio.jp)

name

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

MyModule.name
# => "MyModule"

参考:

instance method Module#inspect (Ruby 2.6.0)

name (Module) | Ruby リファレンス (ref.xaio.jp)

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

参考:

Override module method from another module – Stack Overflow

method_defined?

参考:

instance method Module#method_defined? (Ruby 2.5.0)

method_defined? (Module) | Ruby リファレンス (ref.xaio.jp)

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

参考:

Scope of Constants in Ruby Modules – Stack Overflow

Module.new

参考:

singleton method Module.new (Ruby 2.6.0)

Module.nesting

参考:

singleton method Module.nesting (Ruby 2.5.0)

nesting (Module) | Ruby リファレンス (ref.xaio.jp)

as_namespace

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

参考:

kitaro-tn/as_namespace: Omit the ruby name space by defining in the class – GitHub

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

タグ:

コメントを残す

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