ここ数日Rubyのクラスとオブジェクトについて考えている
まだ整理できていないけど理解したことをリストしておこう
- Rubyのクラスはメソッド定義を持ったオブジェクトである
- メソッドはクラスに定義されそのクラスから生成されたオブジェクトから呼び出されて使われる
- オブジェクト自身はメソッドを持たない
- selfメソッドつまりクラスにおけるクラスメソッド、モジュールにおけるモジュールメソッド、オブジェクトにおけるsingletonメソッドは同じもので、それらはオブジェクトのsingletonクラスに定義されたメソッドのことを言う
- instanceメソッドはクラスに定義されているメソッドをいう
- つまりメソッドには本来種類がなくどこで定義されているかによって呼び名が変わるに過ぎない
- 継承とはあるクラスが他のクラスからメソッドを借り出す機能のことで、継承されたクラス(スーパークラス)のすべてのメソッドつまりそのクラスに定義されているメソッドおよびそのクラスのsingletonクラスに定義されているメソッドはサブクラスのメソッドとなる。スーパークラスにスーパークラスがある場合、そのすべてのメソッドもサブクラスのメソッドとなる。
- includeはあるクラスが他のモジュールからメソッドを借り出す機能のことで、モジュールに定義されているメソッドはそれをincludeしたクラスのメソッドとなる。しかしモジュールのsingletonクラスに定義されているメソッドはincludeされない
- オブジェクトは一つのクラスに対して複数存在し、特定のオブジェクトのsingletonクラスに定義されたメソッドはそのオブジェクト専用のものになる。つまり特定のオブジェクトのsingletonクラスに定義されたメソッドはinstanceメソッドになる
- 一方でClassクラスは複数のクラスを生成するが、特定の種類のクラスは一つのみ生成される。そして特定の種類のクラスのsingletonクラスに定義されたメソッドはそのクラス専用のものになる。つまりクラスのsingletonクラスに定義されたメソッドはクラスオブジェクトのメソッドつまりクラスメソッドになる
- クラスおよびオブジェクトにおいてselfを先行して定義されるメソッドは、singletonクラスへのメソッド定義のシンタックスシュガーに過ぎない
- singletonクラスにおいてselfを先行してメソッドを定義した場合、そのメソッドはsingletonクラスのクラスつまりClassクラスのsingletonクラスに定義されたメソッド(Classクラスのクラスメソッド)となる。
- Classクラスのsingletonクラスにおける場合もClassクラスのクラスメソッドになる。selfを先行しないメソッド定義もClassクラスのクラスメソッドになる。
- モジュールはModuleクラスをクラスとして生成されるオブジェクトだが、クラスオブジェクト同様、メソッド定義を持てる。しかしモジュールはそこからオブジェクトを生成できず、定義されたメソッドは他のクラスにincludeされることでそのクラスに定義されたメソッドになる。しかしモジュールのsingletonクラスのメソッドはそうならない。
- メソッドをprivateにするとレシーバー付きでは呼び出せなくなる。つまりそのメソッドが存在するコンテキストからでないとprivateにされたメソッドは使えない。
- クラスメソッドはクラス定義のなかではプライベートにできない。これをプライベートにするにはsingletonクラスで定義すればいい
- Classクラスにはクラスオブジェクトを生成するためのnewクラスメソッド(これは自身をも生成する)と生成したクラスオブジェクトがオブジェクトを生成できるようにするnewメソッドがある
- Objectクラスには基本的にオブジェクトの挙動を決定する主たるメソッドが定義されている
- Moduleクラスには基本的にクラスオブジェクトの挙動を決定する主たるメソッドが定義されている
- クラス定義はそれ自体がクラスオブジェクトの生成式である
- モジュール定義はそれ自体がモジュールオブジェクトの生成式である
No comments:
Post a Comment