週刊とっしーぱんち

昭和生まれのブロガーが綴る、全力脱力系雑記帳

【趣味ではじめるRuby】オブジェクトについて

しばらくぶりのRubyの記事です。今回はRubyの基本的な要素、オブジェクトについてまとめてました。 独学で理解するためにまとめたものなのですが、Rubyでプログラムをはじめた方も参考になるような記事になれば嬉しいです。

Rubyのデータは全てオブジェクトになっている。

docs.ruby-lang.org

公式リファレンスマニュアルによると「Ruby で扱える全ての値はオブジェクトです。」とあります。これはどういうこと?

「1」という名前のオブジェクト

1は現実世界では数字と呼びますが、Rubyだと「1」というオブジェクトになるようです。

数字とオブジェクトはどう違う?って話になるので、さきほど紹介したリファレンスマニュアルの続きを読んでいくと「Ruby のオブジェクトに対して可能な操作はメソッド呼び出しのみです。」という記述が見つかります。つまりオブジェクトは「メソッド呼び出し」ができるのです。なるほどわからん

メソッド呼び出しとは?

「メソッド」という言葉もリファレンスマニュアルの下段に書いてありました。

「メソッドは実行することができます。その実行を開始することを通常「呼び出す」と言います。」

さきほど紹介したオブジェクトの説明と合体すると、「1というオブジェクトは何かを実行できる。それを指示することを呼び出すという。」って感じになるでしょうか。わかるようなわからないような。何が呼び出せるんでしょう?

オブジェクトはクラスに所属している

リファレンスマニュアルいったりきたりですけど、中段にクラスについての記載があります。みてみると

「クラスは自身に所属するオブジェクトが反応できるメソッドを決定します。」

とあります。ということは「1」というオブジェクトは何かのクラスに所属しているということになります。どこに所属してるんだろ?

すべてのオブジェクトはObjectクラスに所属している

docs.ruby-lang.org

答えは公式マニュアルの組み込みオブジェクトというところに書いてありました。オブジェクトと呼ばれるものは全てObjectクラスに所属しているとのこと。どっちもオブジェクトと発音するのでややこしいですが、オブジェクトクラスとオブジェクトは別の扱いとなるようです。

さらに調べていくと、全てのクラスの頂点にObjectクラスはありますが、そこから受け継がれていったクラスもたくさんあるということです。そうなると「1」というオブジェクトはObjectクラスに所属しているけど、他のクラスにも所属しているということになります。

「1」オブジェクトの所属するクラスの調べ方

クラスを調べる方法はObjectクラスにありました。Objectクラスに搭載されているメソッドのなかに「class」というメソッドがあり、これでオブジェクトが所属するクラスをしらべることができるようです。メソッドの呼び出し方は、オブジェクトの後ろにドット+メソッド名で呼ぶことができるようなので、早速試してみます。

irb(main):001:0> 1.class
=> Integer

どうやら1というオブジェクトはIntegerというクラスに所属しているようです。

ためしに他の数字も試してみます。

irb(main):002:0> 2.class
=> Integer
irb(main):003:0> −100.class
=> Integer
irb(main):004:0> 10000.class
=> Integer

他の数字もIntegerというクラスに所属するオブジェクトであるようです。

IntegerクラスをObjectクラスまで辿っていく方法

docs.ruby-lang.org

組み込みライブラリというページを辿っていくと、たしかにIntegerクラスというのがありました。そしてIntegerクラスの上位にNumericというクラスがあることがわかりました。

これをプログラムから調べる方法ってあるんだろうか?ってことで、再びリファレンスマニュアルを徘徊します。

そうすると、Classというクラスのなかに「superclass」というメソッドがあることを見つけました。

Classクラス(発音がクラスクラスってまたややこしいですよね)は、Classとよばれるものに全て備わっている機能がまとめられていて、「superclass」もその中のひとつのメソッドということです。

Classのクラスってなんなのよ?って話ですが、試しにInteger.classと書いてみると、IntegerはClassクラスだよと出てきます。

irb(main):005:0> Integer.class
=> Class

このあたりの仕組みが理解できてないですが、全てのクラスにはClassクラスがくっついているようです。

話を戻して、「superclass」で何ができるかというと、クラスのさらに上位(親)のクラスがわかるというメソッドのようです。早速試してみます。

irb(main):006:0> Integer.superclass
=> Numeric
irb(main):007:0> Numeric.superclass
=> Object

たしかにこれでクラスの上位下位(親子)関係がわかるようです。

オブジェクトについてわかったこと

まだまだ色々疑問が湧いてくるのですが、だいぶ疲れてきました😅

今回の探索は一旦ここまでにして、今回調べたてわかったことをまとめておきたいと思います。

  • Rubyが認識できる値は全てオブジェクトと呼ばれる。
  • オブジェクトには全て所属するクラスがあり、クラスにはメソッドという機能が付いている。
  • 全てのクラスの頂点にObjectクラスがある。
  • メソッドはオブジェクトの後ろにドット+メソッド名で呼び出すことができる。
  • オブジェクトが所属するクラスは「class」メソッドで調べることができる。
  • 得られたクラス名に「superclass」メソッドで、さらに上位のクラスを調べることができる。

まとめ

ちょっと探索しただけのつもりが、ひとつひとつの工程を記事として書いてみると、結構なボリュームですよね。それにやっているうちにどんどんと疑問が湧いてくるので、横道逸れたり、一旦戻って探索方法を変えたりすることが多いです。まるでゲームを遊んでいるような感覚で面白くも感じるのですが、それはそうと何か動くものを作りたいと思うこともあります。

目的のある何かを作りたい、その手段としてプログラムを書くことも楽しいです。

一方で、今回の記事のようにRuby言語の世界を探索しながら、小さいプログラムを書いて実験するのも同じくらいに楽しいです。

両方の欲求を適度に満たしてくれるRubyと、引き続き楽しく遊んでいきたいと思います。では、また!