Module
ドキュメント:
class Module | Ruby リファレンスマニュアル [公式]
使い方
- ミックスインとして使う (インスタンスメソッド及びクラスメソッドを注入する)
- 名前空間としての役割 (同じ名前のメソッドが作用する範囲や動作を区別する)
参考:
Ruby の Module の使い方とはいったい – Qiita
モジュールで名前空間とミックスインを覚える! | エンジニアライブログ
モジュールとクラスと名前空間 | @katzchang.contexts
Ruby のモジュールを名前空間で使っているのか Mix-in で使っているのか – スタック・オーバーフロー
クラスの拡張
参考:
ruby の require/include/extend/継承/クラス拡張ミックスインまとめ | A Life on Rails
ダブルコロンでのトップレベルの参照と局所的なクラス拡張 – Qiita
名前空間
参考:
ころんころんの話をしよう/もしくはモジュールの名前空間について – Qiita
Ruby におけるダブルコロンについてのメモ – Qiita
Ruby でクラス名のはじめに :: (コロンを2つ) をつけるとそのクラスの絶対的な位置表現をすることができる | コード日進月歩
Ruby の名前空間とレキシカルスコープについて簡潔に説明する – Qiita
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
:モジュール関数として宣言する
参考:
モジュール関数 (module_function)
メソッドをモジュール関数にする。
module_function :foo, :bar, :baz
Code 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 のモジュールメソッドの呼び出し方法 – 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
# => true
Code language: Ruby (ruby)
参考:
Ruby の module メソッドの呼び出し方法 – Qiita
モジュール関数からプライベートメソッドを呼び出す
参考:
文字列またはシンボルから定数を得る
MyModule.const_get(:CONSTANT)
Code language: Ruby (ruby)
参考:
クラス名の文字列からクラスを取得する方法 | present
Module#const_get | Ruby リファレンスマニュアル [公式]
constants
定義済みの定数を列挙する。
mod.constants
Code 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
参考: