メタプログラミングRuby音読会 #2
昨日はメタプログラミングRubyの輪読会へ参加してきました!
今回は、「モンキーパッチ」「継承とインスタンス化」「定数のスコープ」など今まで疑問が多かった内容について学ぶことができました!!
個人的に印象的だった内容について
モンキーパッチ
- オープンクラスを行なって既存のメソッドの挙動を変えるようなことをモンキーパッチといいます。
- 意図的に行うモンキーパッチは良いですが、意図せず発生するものは良くありません。
- 既存のメソッドを変更するより新しいメソッド追加する方が安全です。
※deviseの既存メソッド上書きして挙動を変更させているのもモンキーパッチと近そうです。
オブジェクトモデルの内部
- メソッドはクラスに存在します。
- インスタンスメソッドを使うのはインスタンスでも、そのインスタンスメソッドを保持しているのはクラスです。
- インスタンスメソッドはクラスに、インスタンス変数はインスタンスに存在しています。
※生えてる= 内部に持っている・定義されている
クラスの真相
- クラスの継承関係とインスタンス化の関係を混同しないように気をつけることが重要です。
- クラスはClassクラスのインスタンスでありオブジェクトです。
- クラス名はただの定数です。
- ClassのスーパークラスはModuleです。
こちらの項目では、Rubyにおける継承とインスタンス化について整理することができました!
「クラスの継承関係とインスタンス化の関係を混同しない」ということを踏まえた上で以下の図を見ると、少し理解できるようになりました!!
※@coeさんから教えていただき、Class.newの引数にクラスを渡すと、そのクラスを継承したクラスが生成されることを知りました!!
定数
- 定数は外側へもパスを指定してアクセスできます!
- 変数は種類ごとにスコープが異なりますが、定数は::で階層構造を指定してあげれば、どこで定義されているものにもアクセスできます。
- :: ルートレベル自分のプログラムのルートへアクセスできます。
今まで変数・定数の違いは変更できる・できない(正確には警告出るだけで変更可能)という違いがあるという理解をしていたのですが、
変数と定数ではスコープも違うというのを知りました!
感想その他
今回読む章をあらかじめ自分でも読んでから音読会に望んだのですが、自分では気づかなかった疑問点がたくさん見つかり、深掘りすることができました!!