読者です 読者をやめる 読者になる 読者になる

メタプログラミングRuby その2 [学習メモ]

学習メモ プログラミング Ruby

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

2.2 オブジェクトモデルの内部

Ruby のオブジェクトは動的に定義されるインスタンス変数を持つ

class MyClass
  def my_method
    @v = 1
  end
end

obj = MyClass.new
obj.instance_variables
# -> []
obj.my_method
obj.instance_variables
# -> [:@v]

同じクラスのオブジェクトでもインスタンス変数の数が異なることがある。

メソッドはクラスに所属している。
ややこしいことにメソッドには2種類あって

# インスタンスメソッド
obj.ex_method
# クラスメソッド
MyClass.ex_method

となる。
オブジェクト指向的な呼び出しをするものがインスタンスメソッドで、モジュール的な方がクラスメソッドと言うことだろうか。

クラス自身もオブジェクトで Class クラスに所属している。

String.class
# -> Class

Class クラスのスーパークラスは Module となる。

Class.superclass
# -> Module

ruby において定数は変更可能だ。
なぜこれで定数と呼べるのかと不思議に思える。
定数は独自のスコープを持っている。

module M
  class C
    X = "Constant"
  end
  C::X
# -> "Constant"
end

外側の定数にもアクセスできる

Y = "Root Constant"

module M
  Y = "Inner Constant"
  Y
# -> "Inner Constant"
  ::Y
# -> "Root Constant"

スコープのわかりにくさからこれまであまり定数を使いたくなかったが、名前空間の汚染を防ぐ時などには便利と言うことだ。
そうすることでクラス名には汎用的で短い名前を衝突を気にせずに使える。
ぜひそのうち使ってみよう。

module SomeName
  class Text

# Text には SomeName::Text と言う風にアクセスする。

2.3 は演習問題