Ruby初学者向け〜オブジェクトから考えていこう〜
Rubyの勉強での躓きポイントの1・2を争うのでは無いか!?と思われる、オブジェクトについて軽くまとめたいと思います
1,オブジェクトってなに?
「モノ」です。例えば数字の「1」、「"アップル"」もモノです。
「オブジェクト」の定義は
1.アイデンティティを持っている (どこの誰だか分かっている状態)
2.メッセージを受け取る (処理を受け取れる)
3.内部状態を持つ (値の中身の状態を保持できる)
※「初めてのRuby」(著Yugui)
である為、変数自体はオブジェクトではありません。変数が持っている値がオブジェクトに当たります。メソッドも上記に当てはまらないので例外をのぞいてオブジェクトではないと言えます。
そして、Rubyはオブジェクト指向型言語です。
Rubyにおける「オブジェクト」は全ての根幹であると考えて良いかと思います。
それでは「オブジェクト」を紐解いて行きます。
🌷余談🌷
プログラミング言語について
PCは「0、1」の2進数で物事を理解しています。
PCに何か指示を与える際には、PCが理解できる形で記述する必要があります。しかし、それを人間が都度作成するには膨大な時間がかかりました。
そこで生まれたのが、プログラミング言語。
機械の言語を理解し翻訳してくれ(コンパイルする)、人間の言語に近い形で使用できるプログラムです。
プログラミング言語は色々な種類があります。常に進化して新しい言語が生まれています。
Rubyではすべての値がオブジェクト
Rubyの世界で重要な「クラス」「モジュール」もオブジェクトです。
▼ミルのイメージを共有すると
オブジェクト モノと言う概念
クラス 設計図
モジュール 道具
⚡️重要⚡️
「オブジェクトは概念である」
貴方も、コップもモノなのです。
Rubyの世界では都度「オブジェクト」を作ります。
なので常に「オブジェクト」という概念を持つ必要があります。
2,オブジェクトの基礎
それが「オブジェクト」である時、それは
・どこの誰だか分かっている状態
・ユニークな状態
である必要がります。
完結にまとめると
オブジェクトはどこかのクラス(設計図)に所属し、固有のIDを持っている事になります。
また、私達オブジェクトを作成する時に、どのクラスに所属するのかを決めます。決める方法は3章で!
▼「オブジェクト」のアイアンディを調べる方法
# 数字の場合
irb(main):001:0> a = 1
=> 1
irb(main):002:0> a.class
=> Integer
irb(main):003:0> a.object_id
=> 3
# 文字の場合
irb(main):007:0> a = "asd"
=> "asd"
irb(main):008:0> a.class
=> String
irb(main):009:0> a.class.class
=> class
irb(main):010:0> a.object_id
=> 70174649906580
🐶豆知識🐶
あらゆるクラスは、「Classクラス」から生成(インスタンス)されているのですワン🐶
その「Classクラス」は「Classクラス」から生成されているのだワン🐶
🌷余談🌷
下記の画像の「クラスの継承リスト」を見てください
BasicObject > Kernel > Object > Enumerable > Hash
となっています。なので、「Hashオブジェクト」は「Objectクラス」を継承してます。
「クラスの継承」とは
親クラスを元に、子クラスを作る事。
Rubyではあるクラスが定義したメソッドを、あたかも自分に定義された「もの」のように他のクラスが利用できます。利用される側をスーパークラス(親クラス)、利用する側をサブクラス(子クラス)と呼びます。
クラスの継承を行う事で無駄な記述を省けます。
# スーパークラスの調べ方
irb(main):007:0> Array.superclass
=> Object
※ `Array.superclass`の.superclassの左側の事(この場合Array)をレシーバと言う、「superclass」の事をメッセージと呼びます
3. オブジェクトの生み出し方
オブジェクトの作成方法は
1 クラスをnewメソッドを使用してインスタンスする
2 変数に値を代入し、直接オブジェクトを定義する
の2つの方法があります。
1の方法はでは下記の様に作成します。
class MakeGohan
# ② 初期化処理実行
def initialize(myname = "Ruby")
@name = myname # インスタンス変数
end
# インスタンスメソッド
def call
puts "お腹すいた, #{@name}。"
end
end
# ① インスタンス化
mama = MakeGohan.new("まま")
# ③ インスタンスメソッド実行
mama.call
2の方法では下記の様に作成します。
pants = "ピンク"
オブジェクト を作成する際には、インスタンス化はマストです。
下記手順を必ずおこなっています。
① インスタンス化
・どのクラス(設計図)を元に作成するか?
② 初期化処理実行
・クラス内でオブジェクトの中身初期化
③ インスタンスメソッド実行
・オブジェクトに処理を行う
▼オブジェクトの作成から消失までの流れのイメージ
そして上記2つの方法は違う様に感じますが、実際は2の方法は、よしなに1の様な方法をおこなっております。
そのよしなにやっている事をリテラルと言います。
組み込みクラスでは「リテラル表記」という短縮した記述が可能となっています。文字では値に「” ” 」とすれば「class String」がインスタンス化されます。
インスタンスについて
クラスはオブジェクトの設計図です。
その設計図を元に「オブジェクト」を作る事を「インスタンス化」と呼びます
また、生成されたインスタンスが持っているメソッドの事を「インスタンスメソッド」と呼びます。
※正確にはインスタンスはメソッドを持ってない。インスタンスしたオブジェクトが持っている、帰属クラスに探しに行っている。
小話
全てのオブジェクトはObjectクラスを継承していて
全てのクラスはClassクラスから生まれている
Objectクラスが1つのインスタンスメソッドを持つと
🔽
それがClassクラスを含むすべてのクラスのインスタンスメソッドとなり
🔽
Objectを含むすべてのクラスのクラスメソッドとなり
🔽
Classクラスのクラスメソッドとなります。
こうしてRuby実行空間に存在するすべてのクラスには、インスタンスメソッドとクラスメソッドが生まれることとなるのです。
未経験エンジニアをサポートする為の活動を行ってます。 未来の日本を救う為の活動にサポートをして頂けませんか。ITを支える事が結果自分の将来を支える事になります