LoginSignup
3

More than 1 year has passed since last update.

posted at

updated at

変数とインスタンス変数の違い

【概要】

1.変数とはなにか

2.インスタンス変数とはなにか

3.変数とインスタンス変数はどういう時に使うのか

4.ここから学んだこと

1.変数とはなにか

文字や数字を入れておくための入れ物です!

変数
name = aiueo

上のように使用できます!

変数なので"name"のあとの部分(aiueo)は
お好きなものを入れることができます。
もちろん変数自体もお好きな名前で”定義”することができます。

”定義”するとは、

name = aiueo

の状態をいいます。

”宣言”は変数名をつけて変数を作ることで、"name"単独にあたります。

2.インスタンス変数とはなにか

データが持つ属性を定義する変数です。
つまりクラスに定義されているインスタンスメソッドが持つ各々の設定です。

インスタンス変数

class A
 def B
  @name = aiueo
 end
end

上記がインスタンス変数です。
Aクラスの中に、Bメソッドがあり
Bメソッドが適用されると"aiueo"が"@name"に代入された状態で使用できます。

3.変数とインスタンス変数はどういう時に使うのか

変数は、メソッド外は外でしか使えない。メソッド内は内でしか使えない。(ただ、インスタンスメソッド内で変数を定義するとインスタンスメソッド内でしか使用できないローカル変数という言い方になります)

インスタンス変数は同じクラス内であれば、別のインスタンスメソッド内でも使用できます。またMVCモデルではコントローラーからビューにデータを渡す際に、壁を飛び越えて渡せる超便利変数になります!

ローカル変数(インスタンスメソッド内での変数)ではスコープの概念があるので壁を飛び越えることはできません。

4.ここから学んだこと

コントローラーでローカル変数をつけており、
"NoMethodError"が出たことがありました。
またビューの受け取り先であるeachメソッドで、"@"をつけ忘れており"NameError"となったこともありました。

前者はローカル変数がコントローラーからビューに行く際にそもそもそんなものは定義がされていないと怒られてしまいました。(ローカル変数になってしまっているので)

後者の方は、"@"をつけていないことで配列として受け取れなくなってしまったのでeachメソッドが使えない(eachは配列を受け取るので)=NameError(名前が違っているせいでeachが使用できません)という風に解釈されていると思います。

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
What you can do with signing up
3