LoginSignup
1
0

More than 1 year has passed since last update.

メタプログラミングRuby オブジェクトモデル

Last updated at Posted at 2022-03-06

この章では、オブジェクトモデルとメソッドについて基礎的、そして重要なことが多く述べられています。
それを今回はアウトプットを兼ねて紹介していこうとおもいます。

※この記事ではメソッドという言葉が出てきますが、原則としてインスタンスメソッドを指します。
クラスメソッドを指す時は、明示して記述します。

オブジェクトの中身

インスタンス変数

まずは以下のコードを見てください。

class Example
  def ex_method
    @ex = 1
  end
end

obj = Example.new
obj.class # => Example

ここで大事なのが、インスタンス変数はオブジェクトに含まれているということです。
実際に確かめてみましょう

obj.ex_method
obj.instance_variables #=> [:@ex]

メソッド

オブジェクトはメソッドも持っています。そして同じクラスを持っているオブジェクトはメソッドも共通している。要は、メソッドは、オブジェクトではなく、クラスに存在しているんです。
これは、見ればわかりますよね。

class Example
  def ex_method
    @ex = 1
  end
end

この書き方からも分かる通り、メソッドはクラスに存在しています。

クラスの中身

ここで大事なことを述べます。一番大事なのは、
クラスはオブジェクトであるということです。
クラスはオブジェクトである、といわれてもピンとこない方がいらっしゃるかもしれませんので、実際に確かめてみましょう。
ぼくらがよく知っているArrayクラス、Stringクラスを例に見てましょう

Array.class #=> Class
String.class #=> Class

つまり、StringクラスやArrayクラスは、Classクラスのオブジェクトであるということが言えます。
「メソッド」の部分でも述べたように、オブジェクトでのメソッドは、そのクラスのインスタンスメソッドです。
ということは、クラスのメソッドは、Classクラスのインスタンスメソッドです。
実際に確かめてみましょう。

Class.instance_methods(false) #=> [:new, :allocate, :superclass]

クラスを生成する際に使われるnewメソッドは実は、Classクラスのインスタンスメソッドだったんです。

モジュール

では、Classクラスの親クラスは何なのでしょうか?

Class.superclass #=> Module

個人的にこの章で驚いたのが、Classクラスの親クラスはModuleだったことです。このことから、すべてのクラスはModuleであることが分かるんです。
そして、ClassやModuleは定数なんです。

定数について

定数は大文字で始まるものです。そのためModuleやClassは定数といえるんです。
定数の特徴は独自のルールに従っているんですね。以下の例を見てください

Module MyModule
  MyConstant = "外側にある定数"

  class Myclass
    MyConstant = "内側にある定数"
  end
end

ディレクトリ構造で示すとこのような形になります。

MyModule/MyConstant
MyModule/MyClass/MyConstant

同じ名前のMyConstantでも入っている値は違います。ディレクトリ構造に似ていますね。
このようにネストできる定数を1個に特定できます。その際にはコロン2個使います。
実際に書いてみましょう

module M
  Constant = "外側にある定数"

  class Example
    Constant = "内側にある定数"
  end
end
M::Constant #=> "外側にある定数"
M::Example::Constant #=> "内側にある定数"

オブジェクトとクラスをまとめてみる

オブジェクトとは、インスタンス変数の集合体で、クラスとつながっているものです。
クラスとは、Classクラスのオブジェクト(インスタンス)であり、そこにインスタンスメソッドがあり、親クラスがあるものです。
そしてClassクラスはModuleクラスの子クラスです。

個人的な感想ですが、オブジェクトを言葉で説明しようとすると結構難しいとおもいます。
抽象的概念だし、rubyにおいてはあらゆるものがオブジェクトだからです。

以上です。何か間違いがございましたら、ご教示いただけますと幸いです。

【参考文献】

1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0