こんにちは、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 #=>何も返らない
最後に
以上がインスタンス変数・クラス変数・クラスインスタンス変数の違いと用例でした
ややこしいので分からなくなったら再度チェックしてくださいね!
それでは、また