Closed4

メタプログラミングRuby 2章 月曜日: オブジェクトモデル

akkyakky

オブジェクトモデル とは何なのか?

akkyakky

Rubyでは既に定義されたクラスを改めて再オープンしてメソッドを追加することが出来る。
既存のクラスを再オープンして、いくらでも修正が可能となる。
この技法をオープンクラスと呼ぶ。

akkyakky

オープンクラスだと、既存のメソッドを上書きすることも可能となる。

安易にクラスにコードを追加してしまうことを狭義のモンキーパッチと呼びそう。
意図的にオープンクラスの技法を適用すること広義のモンキーパッチと呼んでいそう。

P.38のRefinementsを使えば安全にモンキーパッチを使用できるらしい。

akkyakky

オブジェクトは幾つかの要素を持っている。

インスタンス変数

オブジェクトはインスタンス変数を持つ。
Rubyでは、インスタンス変数は値が代入されて初めて出現する。
オブジェクトに依ってインスタンス変数の数や名前が異なる可能性がある。
Object#instance_variables で確認できる。

メソッド

オブジェクトはメソッドを持つ。
Object#methods で確認できる。

実を言うとオブジェクトにはメソッドは存在していない。
オブジェクトは「インスタンス変数とクラスへの参照のみ」を持っている

test.rb
class MyClass
  def my_method
    @v = 1
  end
end

obj = MyClass.new
puts obj.class # => "MyClass"

p "before: ", obj.instance_variables # => []
obj.my_method
p "after: ", obj.instance_variables # => [:@v]

# p obj.methods # => [:my_method]
p obj.methods.grep(/my/) # => [:my_method]

class MyClass
  def my_my_method
    @v = 2
  end
end

# p obj.methods # => [:my_method]
p obj.methods.grep(/my/) # => [:my_my_method, :my_method]


このスクラップは2021/08/05にクローズされました