メタプログラミングRuby 2章メモ
https://scrapbox.io/files/6599eda8173c1e00254bf9dc.png
オブジェクトモデル
このメソッドはどのクラスに所属するのか
インクルードしたら何が起こるのか
などをまとめてあるもの
文字を受け取って変換して文字を返すパターン
議題:文字列自身のメソッドにしたらどうかという話
オブジェクト指向的な考え方では、オブジェクトはデータと操作をカプセル化し、他のオブジェクトから隠蔽することが重要だから、わざわざ別で作るんじゃなくて文字クラスに実装すれば?問い話題になる
Rubyは実行時にコードが定義される
Classもそれは同じ
技法:オープンクラス
code: Ruby
Class String
def new_string_method
puts "yay"
end
end
こんなの
当然、既存のメソッドとかぶると上書きされてしまう(※モンキーパッチ)
インスタンス変数
呼び出さなければ存在しないため、オブジェクト同士でもインスタンス変数の数が異なることもある
メソッドはオブジェクトではなく、クラスに存在する
なるほど
但し、説明する場合にインスタンスメソッドなのかクラスメソッドなのかごっちゃにならないようにする
ここまでの重要ポイント
インスタンス変数はオブジェクトごとに定義されるもの
オブジェクトとは、インスタンス変数の集まりにクラスへの参照がついたもの
メソッドはクラスに定義されるもの
オブジェクトにインスタンスメソッドの一覧とスーパークラスへのリンクがついたもの
全てのクラスはモジュール
ClassクラスのスーパークラスがModuleだから
Module#constantsとinstance method Module#constantsがある
クラスメソッドの方はトップレベル定数を返す
インスタンス変数は現在のスコープにある定数を返す
ネームスペース
定数をまとめるモジュールという意味で今回は使われている
loadで呼び出すとファイルは実行される。定数名などは指定しないと読み込まれてしまう。
メソッド探索
Rubyはクラスの中からメソッドを探す
code: Ruby
hoge.fuga
# この時、hogeはレシーバ
# fugaは実行されるとhoge、そのスーパークラス、そのスーパークラス...と辿っていく(メソッド探索
ここで注意点としては、なんとModuleも継承チェーンに含まれる
Moduleの継承
prependを使うと、継承関係的にスーパークラスよりも先に読み込まれる
ObjectクラスがKernelモジュールをインクルードしているから、全ての場所で使える
メソッドの実行手順
selfを意識する
オブジェクトを呼び出すと、そのオブジェクトがself(カレントオブジェクト)になる
private
暗黙的なselfレシーバーの時のみ動く
self.private_methoodとかも動かない
Refinements
Ruby2.0から登場
refineを使って定義したものは、usingを使うことで使用できる
→オープンクラスのようにいきなり大きな影響を及ぼさずに済む
グローバルではないということ
最新の挙動は要チェック
継承は押し上げる
code: ruby
class Hoge
include A
include B
end
Hoge→B→Aになる
結論:メソッド探索の順番によっては、実装されているメソッドの呼び出し元も変わるので注意すること
用語メモ・調査
ビルドシステム
ビルドシステムとは、プロジェクトに関連するソースファイルやリソースファイルから実行可能なプログラム(≒成果物)を生成するための処理を自動化する機能の事です。