オブジェクト
オブジェクトとは、現実世界に存在するあらゆく「もの」や「概念」のことである。 ```
例)人間 / 車 / クラス など
また、実際にコードに当てはめて考えた場合、以下のuserがオブジェクトとなる。
class Test
def index
user = User.all
user.find(1)
end
end
## クラス
クラスとは、共通の性質を併せ持つオブジェクトをまとめた抽象概念である。
例)
オブジェクト : Aさん / Bさん
クラス : 3年4組 / 男性 / 運動部
また、railsの場合、以下classで定義されている全体がクラスということになる。
class Test
def class_test
end
end
## クラスメソッド
クラスに直接働きかけるメソッドのこと。また、 class << クラス名 or self で括った中のものがクラスメソッドとなり、それ以外はすべてインスタンスメソッド扱いになる。
class << self
def class_test
end
end
## インスタンス
クラスを型とした場合、インスタンスはその実際の値であったり、データのことを指す。例えば、クラスのインスタンスはオブジェクトである。
## インスタンスメソッド
インスタンスに働きかけるメソッド
以下の場合、配列のインスタンスに対してindexメソッドを働かせている
['1','2','3'].index(1)
## インスタンス変数
- クラスから生成されるオブジェクトごとに固有のものである。
class Test
def new
@test = Test.new
end
end
## レシーバ
あるオブジェクトに対して、メソッドを実行しようとした場合、そのメソッドの働きかけるオブジェクトのことをレシーバという。以下のコードの場合だと、配列部分がレシーバとなる。
['1','2','3'].index(1)
## self
- メソッドを実行したときに、そのメソッドを実行しているオブジェクトを参照することができる。
- レシーバとの違いは、レシーバはメソッドの働きかける先のオブジェクトの呼び方で、selfは働きかける先のオブジェクトに実際にコード上で参照することである。
- メソッドを呼び出したとき、すべてのインスタンス変数は、selfのインスタンス変数となる。また、selfを明示せずメソッドを呼び出した場合、すべてselfに対するメソッドになるし、レシーバを他のオブジェクトを指定して、呼び出した場合、そのオブジェクトのメソッドとなる。
```例1
class Test < ActiveRecord::Base
def class_test
end
# class_testはインスタンスメソッド
def self.class_test
end
# self.class_testはクラスメソッド
end
class Test < ActiveRecord::Base
def class_test
end
# インスタンスメソッド
def self.class_test
end
# クラスメソッド
def test
self.class_test
# インスタンスメソッドのclass_testが呼び出される
class_test
# インスタンスメソッドのclass_testが呼び出される
self.class.class_test
# クラスメソッドのclass_testが呼び出される
end
end
〜例3のcontrollerと例4のmodelの関係が対応している時〜
class Test < AppricationController
def index
@instance_test = Text.class_method(test_id)
end
end
class Text < ActiveRecord::Base
def self.class_method(test_id)
where(id: test_id)
end
end
上記のようにcontroller内のコードを仮にmodelに分割した場合、model内のclass_methodはクラスメソッドになるので、Testクラスのメソッドという扱いになる。よって、controller側で使用したい場合は、クラスを指定したうえ(今回だと、Test)で、メソッド名を書くことで(class_method)動かすことができる。
private関数
- privateメソッドを呼び出す時は、レシーバを指定することができない
- 自分(self)以外のオブジェクトのメソッドを呼び出すときには、オブジェクトをレシーバとして明示する必要がある
class Test
def new
self.private_test
end
private
def private_test
p 'private test is success!!'
end
end
上記のような場合は、private関数内のメソッドを呼び出すことはできない。