1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[ Ruby ]クラスインスタンス変数などなど

Last updated at Posted at 2020-10-14

はじめに

ここでは、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点が違いです。

  • インスタンスメソッドから参照
    • クラス変数・・・できる
    • クラスインスタンス変数・・・できない
  • 継承したクラスから参照、変更
    • クラス変数・・・できる
    • クラスインスタンス変数・・・できない

おわり

1
1
0

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?