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

MogLog

メモというか日記というか備忘録というか

【Ruby】オブジェクト

プログラミング言語 Ruby』 オブジェクト

Rubyにおいて、全ての値はオブジェクト
・全てのオブジェクトは、Objectという名前のクラスを継承しており、このクラスで定義されているメソッドを共有する


1.オブジェクト参照
Rubyではオブジェクトを操作する時、実際に操作しているのは「オブジェクト参照」である。プログラムが操作しているのは、オブジェクト自体ではなく、オブジェクトの参照。

変数に値を代入するときは、代入先の変数の「中に」オブジェクトをコピーするのではなく、変数にオブジェクトの参照を格納しているにすぎない。

s = "Ruby" # Stringオブジェクトを作り、参照をsに格納する
t = s            # 参照のコピーを作ってtに格納する。sとtは同じオブジェクトを参照する
t[-1] = ""   # tに格納された参照を介してオブジェクトを書き換える
print s         # sを介して書き換えられたオブジェクトにアクセス。"Rub"と表示される
t = "Java"   # tは別のオブジェクトを参照している
print s,t      # "RubJava"と表示


Rubyではメソッドにオブジェクトを渡した時、メソッドに実際に渡されるのは、オブジェクト参照である(オブジェクト自体でもなく、オブジェクトの参照の参照でもない)。
言い換えれば、メソッド引数は「参照渡し」ではなく「値渡し」されるが、渡される値自体はオブジェクト参照なのである。

メソッドに渡されるのがオブジェクト参照なので、メソッドはその参照を使ってオブジェクトを書き換えられる。だから、メソッドの呼び出しから戻ってきた後も変更内容は見える状態で残っている。

○即値
Rubyのすべての値はオブジェクトであり、オブジェクトは全て参照によって操作されると説明したが、リファレンス実装では、FixnumとSymbolだけは参照ではなく、「即値」になっている。しかし、即値があることは、実装の詳細と考えるべきだ。即値と参照値の実際上の違いは、即値は特異メソッドを定義できないことだけである。


2.オブジェクトの寿命
Rubyの組込みクラスはリテラル構文を持っており、そのようなクラスのインスタンスは、コード内に値をリテラルに書き込むだけで作成される。
→「1」と打てば、Integerクラスのインスタンスとして生成されるし、「"hoge"」と打てば、Stringクラスのインスタンスが生成される。

しかし、それ以外のクラスのオブジェクトは明示的に作成しなければならない。そして、作成方法としては、newという名前のメソッドを使うことが多い。

myObject = myClass.new

newはClassクラスのメソッドである。新しい「空」オブジェクトを保持するためのメモリを確保し、initializeメソッドを呼び出してからオブジェクトの状態を初期化する。

※Classクラスについて
クラスのクラス。より正確に言えば、個々のクラスはそれぞれメタクラスと呼ばれる名前の無いクラスをクラスとして持っていて、Classはそのメタクラスのクラスである。この関係は少し複雑だが、Rubyを利用するにあたっては、特に重要ではない。

※クラスとモジュールの違い
・クラスはインスタンスを作成できるが、モジュールはできない。
・モジュールは他のモジュールやクラスにインクルードすることができるが、クラスをインクルードすることはできない。
参考URL(http://doc.ruby-lang.org/ja/1.9.3/class/Class.html

リテラルとは
リテラルとは、1.0、"Hello, world"、[]などのように、プログラムのソースコードに直接埋め込むことのできる値である。(『プログラミング言語 Ruby』から)


3.オブジェクト識別子
全てのオブジェクトは、Fixnumのオブジェクト識別子を持っている。
この値はobject_idメソッドによって取得できる。このメソッドが返す値は、オブジェクトの生涯にわたって一定であり、一意的である。
オブジェクトがアクセスできる状態である限り、そのIDは同じであり、同じIDを共有するオブジェクトは決して無い。


4.オブジェクトのクラスと型
Rubyではオブジェクトのクラスが何かを取得するための方法が複数ある。

Rubyでは全てのオブジェクトがハッキリと定義されたクラスを持ち、そのクラスはオブジェクトの生涯を通じて変わらない。しかし、オブジェクトの型はもっと流動的である。オブジェクトの型はクラスと関係を持っているが、クラスはオブジェクトの型の一部に過ぎない。
オブジェクトの型に言及するのは、オブジェクトを特徴づける振る舞いがどのようなものかを話題にしているときだ。言い換えれば、オブジェクトの型とは、応答できるメソッドの集合のことである。

Rubyではオブジェクトのクラスが問題になることはあまりなく、本当に知りたいのはあるメソッドを実行できるかどうかということが多い。

Rubyではクラスではなく、型を重視する姿勢を貫くと「ダックタイピング」とよばれるプログラミングスタイルを取るようになる。