はじめに
本記事は、インスタンス変数とローカル変数の違いをまとめたものです。
正確な理解ができていなかったため、アウトプットします。
結論
いきなり結論ですが、
スコープの違いです。
スコープとは、
ある変数や関数などの名前を参照できる範囲のこと。
ローカル変数の範囲
ローカル変数は、極端に言いますと、
定義した場所でしか使えない。ということです。
例えば、def~endで定義したのであれば、その場所でしか使えない。
という認識です。
インスタンス変数の範囲
インスタンス変数は、
定義した場所以外でも使用可能です。
例えば、def~endで定義していない場所、
コントローラー内で定義したのであれば、ビューでも使用できる。
という認識です。→(8月4日訂正、以下の通り)
コントローラーで作ったインスタンス変数は、
ビュー側でも同じ名前のインスタンス変数を作ることができ、
その変数の値を使用することができる。
(@scivola さん ご指摘ありがとうございます!)
例文
コントローラーやビューなどを考慮せずに、
この文章内だけで考えた場合、
①と②、どちらが正しいだろうか。
①
def update
@tweet = Tweet.find(params[:id])
if @tweet.update(tweet_params)
redirect_to tweet_path
else
render :edit
end
end
②
def update
tweet = Tweet.find(params[:id])
if tweet.update(tweet_params)
redirect_to tweet_path
else
render :edit
end
end
正解は、①も②も正しい。
では、
①②それぞれコントローラーで記述し、ビューでも使用する場合だと
どちらが正しいだろうか。
・
・
・
・
・
・
・
・
正解は、①となります。
ビューでも使うということは、
スコープの関係から、インスタンス変数を使用している①が正しいということになります。
疑問点
ローカル変数を使うメリットはあるのか?
ここで疑問点です。
全てをスコープの大きいインスタンス変数にすることで、
エラーが起こりにくくなり、コードが楽に記述できるのではないかと思えます。
しかし、
ローカル変数を使う理由があります。
ローカル変数を使う理由
全てをインスタンス変数として設けてしまうと、
・結果的に必要のない部分にまでインスタンス変数を使用することで、
可読性に欠けてしまう。
・逆に、分かりづらくなることで、予期せぬエラーが発生してしまう。
大規模な開発になると、
どの記述がうまくいっていないのか、どこでエラーを起こしているのか、
などを把握しづらくなってしまいます。
インスタンス変数を使わずに済む部分であれば、
ローカル変数を用いることで、そのような事態を未然に防ぐことができます。
終わり
過去に、私が疑問に思ったことでしたので、
忘れないためにもここに記述いたしました。
基礎の基礎の部分ですが、
いざコードを記述するときに基礎の部分が抜けてしまいがちです。
不安に思うことや、理解できていそうで言語化できない部分については、
理解できていないことの方が多いです。
これからも学習中に疑問に思うことは、
どんどん深堀していきます。
引き続き頑張ります!!!