はじめに
ここでは、rubyのクラス変数やインスタンス変数、アクセサなどの
基礎となる部分を書いていきます。
クラス変数
そのクラス自身、サブクラスや
クラスメソッド、インスタンスメソッドから参照することができる変数です。
定義の仕方は頭に@@
を付けます。
class SuperKlass
@@super_klass_var = :super_klass_val
end
class Klass < SuperKlass
@@class_var = :class_val
def self.class_method
puts "class_method called"
puts @@super_klass_var
puts @@class_var
end
def instance_method
puts "instance_method called"
puts @@super_klass_var
puts @@class_var
end
end
klass_instance = Klass.new
Klass.class_method
# => class_method called
# => super_klass_val
# => class_val
klass_instance.instance_method
# => instance_method called
# => super_klass_val
# => class_val
インスタンス変数
インスタンス変数に値を保持することで、オブジェクト固有の状態を保持できるようするものです。
なお、インスタンス変数はオブジェクトの外部からは直接アクセスすることが出来ないため、
アクセスするためにattr_accessor
メソッドを使用する必要があります。
class Famiry
attr_accessor :name
end
father = Famiry.new
father.name
# => nil
father.name = "Namihey"
father.name
# => Namihey
attr_accessorを使用しない場合はNoMethodErrorとなります。
class Famiry
end
father = Famiry.new
father.name = "Namihey"
# => undefined method `name=' for #<Famiry:0x00007f8a97908bd8> (NoMethodError)
なお、インスタンスメソッド内で頭に@
を付けるて定義すると、インスタンス変数になります。
class Geinin
def initialize(val)
@val = val
end
def tukkomi
puts @val
end
end
east = Geinin.new("なんでだよ")
east.tukkomi
north = Geinin.new("なんでやねん")
north.tukkomi
attr_accessor
インスタンス変数に対して、参照
、代入
を許可するメソッドです。
代入は拒否し参照のみを許可する場合はattr_reader
参照は拒否し代入のみを許可する場合はattr_writer
などを使い分けます。
このようなメソッドをアクセサ
と呼びます。
なお、上記のメソッドを使用することで以下のメソッドが定義されます。
# 参照メソッド
def name
@name
end
# 代入メソッド
def name=(val)
@name = val
end
クラスインスタンス変数
クラスはClassクラスのオブジェクトであるため、クラスオブジェクト自体に
インスタンス変数を持たせることができます。
selfがクラスを指すコンテキストで、上記のインスタンス変数と同じように
頭に@
をつけて定義するとクラスインスタンス変数となります。
なお、参照できるのもself
がクラスを指すコンテキスト内となります。
class klass
# 定義
@class_instance_val = :class_instance_val
def self.class_method
# 参照
@class_instance_val
end
end
クラス変数とクラスインスタンス変数の違い
クラス変数とクラスインスタンス変数が、同じように感じるかもしれませんが
クラスインスタンス変数は、クラスオブジェクトのインスタンス変数であるため
そのクラスで定義されたインスタンスメソッド内では、参照することができません。
また、クラス変数はそのクラスを継承したクラスから参照、変更できますが
クラスインスタンス変数はできません。
まとめると、以下の2点が違いです。
- インスタンスメソッドから参照
- クラス変数・・・できる
- クラスインスタンス変数・・・できない
- 継承したクラスから参照、変更
- クラス変数・・・できる
- クラスインスタンス変数・・・できない