プログラミングに役立つ情報をメモしています
Ruby プログラミング

Ruby入門 PART3 (クラス) (全11回)

パーフェクトRubyを読んで、重要なポイント等をメモしていきます.

変数、定数のスコープについて

クラス、モジュール、メソッド、トップレベルはそれぞれ独立したローカルスコープを持つ。

そのため、それぞれで定義したローカル変数は、直接参照できない。

ただし、定数(先頭の文字が大文字の変数は、定数と判断される)の場合は、ネストを内側から外側にたどって順番に定数を探索するので、例えば、クラスで定義した定数をメソッドで参照することができる。

また、定数が、ネストを外側に向かって辿って見つからなかった場合、さらに自分のスーパークラスの定数も探索する。ただし、自分の上位の階層のモジュール・クラスが継承しているスーパークラスは、探索しない(自分の祖先にあたる場合は、スーパークラスをたどるときに探索される)。結構ややこしい。

逆に、参照ではなく定数に代入する場合は、現在のスコープで新しい定数を定義したことになる(定数のオーバーライド)。クラス(モジュール)に定義された定数を、外部のスコープから参照する場合は、ClassFoo::ConstFooという風に::を付ければ参照できる。

クラス(モジュール)変数は、@@varというふうに@@を付ける。クラス変数は、メソッド内で参照、代入ができる。クラスの外からは直接参照できない。

インスタンス変数は、メソッド内で@varというふうに定義する。インスタンス変数は、インスタンス後に初期化する。いわゆるsetter/getterは、クラス内でattr_accessor :foo, :barというふうに書くと、自動的にfoo, foo=メソッドが定義される。c#でpublic int foo {get; set;}と書くのと似たようなもの。

クラス定義

クラスメソッドの定義(特異メソッド)

クラスもオブジェクトなので、オブジェクトと同様に特異メソッドを作れる。クラスオブジェクトの特異メソッドをクラスメソッドと呼ぶ。

クラスの継承

単一継承をサポート(複数継承のようなことはMix-Inで実現できる)

<を使う

superは現在のメソッドがオーバーライドしているスーパークラスのメソッドを呼び出す

インスタンス化

クラスオブジェクトのnewを呼び出す

メソッドが属しているインスタンスへの参照(self)

メソッド内で属しているインスタンスを参照するときはself