Ruby

インスタンス変数・クラス変数・クラスインスタンス変数の違いと用例【Ruby】

更新日:

こんにちは、Shinyaです

Rubyの勉強をしていくなかで色んな種類の変数が出てきてややこしいということはないでしょうか?

今回は変数の中でもインスタンス変数・クラス変数・クラスインスタンス変数に焦点を当てて、これらの変数の違いと用例について解説していきます

この記事を読んで分かること

インスタンス変数・クラス変数・クラスインスタンス変数の違いと用例

なお、本記事は以下の記事を参考にしています

それぞれの変数の違い

それぞれの変数の特徴を挙げて違いを見ていきます

インスタンス変数

  • インスタンスごとに異なる値を持つ変数
  • インスタンスメソッド内でのみ扱える

クラス変数

  • クラスごとに固有の値を持つ変数
  • クラスメソッドでもインスタンスメソッドでも扱える
  • 継承したクラスで使用可能

クラスインスタンス変数

  • クラスごとに固有の値を持つ変数
  • クラスメソッドでのみ扱える(インスタンスメソッドで扱えない)
  • 継承したクラスで使用不可能

次にそれぞれの変数の用例を実際に見ていきます

インスタンス変数の用例

インスタンスメソッド内で先頭に"@"をつけることでインスタンス変数として扱えます

def name=(name)
  @name = name  #@nameというインスタンス変数に値を代入(同時に宣言)
end

インスタンスごとに異なる値を持たせられます

class User

  #セッター
  def name=(name)
    @name = name
  end

  #ゲッター
  def name
    @name
  end

end

shinya = User.new
takeshi = User.new

shinya.name = "Shinya"
takeshi.name = "Takeshi"

puts shinya.name  #=>"Shinya"が返る
puts takeshi.name  #=>"Takeshi"が返る

インスタンスメソッド内でしか扱えません

class User

  #セッター
  def name=(name)
    @name = name
  end

  #ゲッター
  def name
    @name
  end

  @name = "Takeshi" #これはクラスインスタンス変数とみなされる(後述)

end

shinya = User.new

puts shinya.name #=>何も返らない
shinya.name = "Shinya"
puts shinya.name  #=>"Shinya"が返る
puts @name #=>何も返らない

アクセサメソッドを使うとセッター・ゲッターを省略可能

class User

 attr_accessor

end

shinya = User.new

shinya.name = "Shinya"
puts shinya.name  #=>"Shinya"が返る

クラス変数の用例

クラス内で先頭に"@@"をつけることでクラス変数として扱えます

class Post

  @@limit = 100 #クラス変数宣言

end

クラスごとに固有の値を持ちます(インスタンス間で共通の値)

また、クラスメソッドでもインスタンスメソッドでも扱えます

class Post

  @@limit = 100 #クラス変数宣言

  def show_limit
    puts @@limit
  end

  def self.show_limit
    puts @@limit
  end

end

post_first = Post.new
post_second = Post.new

post_first.show_limit #=>100が返る
post_second.show_limit #=>100が返る
Post.show_limit #=>100が返る

継承したクラスでも扱えます

class Post

  @@limit = 100 #クラス変数宣言

end

class Tweet < Post

  def self.double_limit
    @@limit *= 2
  end

end

puts Tweet.double_limit #=>200が返る

クラスインスタンス変数の用例

インスタンスメソッド内ではなくクラス内で先頭に"@"をつけることでクラスインスタンス変数として扱えるようになります

class Post

  @limit = 100 #クラスインスタンス変数宣言

end

クラスごとに固有の値を持ち、クラスメソッドでのみ扱えます

インスタンスメソッド内ではインスタンス変数として扱われてしまうので、クラスインスタンス変数は扱えません

class Post

  @limit = 100 #クラスインスタンス変数宣言

  def show_limit
    puts @limit
  end

  def self.show_limit
    puts @limit
  end

end

post = Post.new

post.show_limit #=>何も返らない
Post.show_limit #=>100が返る

継承したクラスでは使えません

class Post

  @limit = 100 #クラスインスタンス変数宣言

  def self.show_limit
    puts @limit
  end

end

class Tweet < Post
end

Tweet.show_limit #=>何も返らない

最後に

以上がインスタンス変数・クラス変数・クラスインスタンス変数の違いと用例でした

ややこしいので分からなくなったら再度チェックしてくださいね!

それでは、また

-Ruby
-

Copyright© 初心者のためのプログラミング独学ブログ , 2023 All Rights Reserved Powered by STINGER.