Closed4
メタプログラミングRuby 2章 月曜日: オブジェクトモデル
オブジェクトモデル とは何なのか?
Rubyでは既に定義されたクラスを改めて再オープンしてメソッドを追加することが出来る。
既存のクラスを再オープンして、いくらでも修正が可能となる。
この技法をオープンクラスと呼ぶ。
オープンクラスだと、既存のメソッドを上書きすることも可能となる。
安易にクラスにコードを追加してしまうことを狭義のモンキーパッチと呼びそう。
意図的にオープンクラスの技法を適用すること広義のモンキーパッチと呼んでいそう。
P.38のRefinementsを使えば安全にモンキーパッチを使用できるらしい。
オブジェクトは幾つかの要素を持っている。
インスタンス変数
オブジェクトはインスタンス変数を持つ。
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にクローズされました