Rubyのグローバル変数を理解する|ローカル変数との違いは?
Rubyの変数について理解しよう!
Rubyの変数の種類
Rubyには色々な種類の変数があります。
・グローバル変数
・ローカル変数
・組み込み変数
・インスタンス変数
・クラス変数
などといった種類の変数が存在します。
Rubyにおいてこの変数の役割を理解してソースコードを書くことは非常に重要なことです。処理の使用用途によって使用する変数の種類も変化するので変数の勉強はプログラミングを勉強していく上で最初に行う勉強です。
この記事では以上の五種類の変数の役割を説明すると共にソースコードの書き方の例を交わらせて実践的に書き方も勉強していく形で進めて行きます。
実際に自分でソースコードを書き込んで、実行して動作を確認しながらこの記事を読み進めるとより理解が深まります。それぞれの変数の役割をしっかりと把握してから実践的にRubyのソースコードを書いて行きましょう。
グローバル変数について
グローバル変数の特徴
グローバル変数とはどこでも使用できる変数のことです。
Rubyで宣言したグローバル変数はメソッドやクラスを超えて値を参照することが可能です。値の変化や変数名の命名など気をつけることが大切です。
Rubyでグローバル変数を宣言する時は頭に$
と書きます。$name
※nameは変数名
変数名の頭文字は小文字になるように命名しましょう。
どの様な場合で使われるか
1つの例としてRubyのソースコードを用いて説明します。
以下のコードではグローバル変数に"Hello_1"という文字列を代入して出力させるコードです。
#hello_1と出力するソースコード
class SayHello
$hello1 = "Hello_1" #グローバル変数を宣言
def say
p $hello1 #Hello_1
end
p $hello1 #Hello_1
end
p $hello1 #hello_1
以上のコードではクラス内にグローバル変数を宣言しました。グローバル変数ではクラス内のどのメソッドでもその変数を書くと代入されたものが出力できます。
加えて、クラス外でも出力することができます。メソッド内やメソッド外、クラス外でもどこでも出力することができるのがグローバル変数です。
ローカル変数との違い
グローバル変数と違い、ローカル変数では宣言したスコープ内でしか使うことが来ません。
先ほどのグローバル変数のソースコードをローカル変数に置き換えてソースコードを追加して実行してみましょう。
class SayHello
hello1 = "Hello_1" #ローカル変数を宣言
def say
p hello1 #エラー
end
p hello1 #Hello_1
end
sayhello = SayHello.new #インスタンス化
p sayhello.say #エラー
p hello1 #エラー
上記のソースコードではインスタンス化した変数を元にsayメソッドを処理しています。するとエラーが出てきます。このエラーは、sayメソッドにあるhello1という変数は宣言されていないという意味になります。
同じClassスコープ内では出力できるのですが、違うスコープになると使用できなくなります。スコープの壁を乗り越えられないのがローカル変数です。
組み込み変数とは
Rubyにおいて組み込み変数とは、Rubyが前もって用意している処理によって意味を与えられる変数です。定義する変数やクラスとはまた別として組み込み変数とついています。組み込み変数では普通の変数として使用が不可です。
少し補足ですが組み込み変数とは別に組み込み定数というものがります。組み込み定数とは、 標準出力や、環境変数を返すことなど、色々なものがあります。これらのことを組み込み定数といいます。
組み込み変数を覚えるついでに組み込み定数も覚えとけば勉強効率が上がり、勉強がし易いでしょう。
その他のRubyの変数
ローカル変数
Rubyのローカル変数とは、宣言したスコープ内でしか使用できない変数です。
宣言は小文字または_ではじめます。name
宣言するときの変数名の頭文字は小文字で宣言して下さい。
以下のソースコードではローカル変数を利用して"Hello_1"という文字列を出力する処理を
書いたソースコードです。
class SayHello
def say
hello1 = "Hello_1" #ローカル変数を宣言
p hello1
end
p hello1 #エラー
end
Say = SayHello.new
Say.say #Hello_1
上記のコードではローカル変数を宣言したsayメソッド内では変数hello1が使用できていますが、sayメソッド外ではローカル変数なので使用できていません。エラーが出ている原因は、hello1という変数が定義されていないのでエラーが出ます。
以上から、宣言したスコープ外では使用できなくなるのがローカル変数です。
インスタンス変数
インスタンス変数は、クラス内で全メソッドで共通して使用することができる変数です。
インスタンス変数を初期化しないとインスタンス変数を参照した時の値はnilです。
宣言時は頭に@をつけます。@name
※nameは変数名
以下コードはインスタンス変数を利用した"Hello_1"という文字列を出力するコードです。
class SayHello
def initialize
@hello1 = "Hello_1" #インスタンス変数を宣言
end
def say
@hello1
end
end
hellosay = SayHello.new
p hellosay.say #Hello_1
以上から他のメソッドでもインスタンス変数は使用することができます。他のメソッドで宣言して、また他のメソッドでその変数を使って処理を行うといった形の処理を書くことができるのでインスタンス変数は大事です。
クラス変数
クラス変数とは、宣言したクラスやそこから生成されるインスタンスの中ならどこからでも参照可能な変数です。クラス変数は再代入可能で、サブクラスやインスタンスメソッドから参照・代入が可能です。
宣言では変数名の頭に@@
をつけます。@@name
※nameは変数名
以下のコードではインスタンス化した後にクラス変数を呼び出して出力をしているコードです。
class SayHello
def initialize
@@hello1 = "Hello_1" #クラス変数を宣言
end
def say
@@hello1
end
def sayplus
@@hello1 + "Hello_2"
end
end
hellosay = SayHello.new
p hellosay.say #Hello_1
p hellosay.sayplus #Hello_1Hello_2
まとめ
どのプログラミング言語にも言えますが、Rubyには多くの種類の変数があります。それぞれの変数によって用途が異なるのでしっかりと役割を把握してから使用するのが良いでしょう。
変数名は自分で好きなものを命名できますが処理に合った名前にしましょう。
グループ開発する際でも自分が書いたソースコードの中の変数を適切な変数名にしとくとソースコードの可読性を上げることができます。自分だけ理解していれば良いという考え方だとグループ開発の際に周りが大変な思いをすることになるので、変数名は処理に合った適切な変数名に命名しましょう。
Rubyにおいてどこでも参照できる様な変数を使いすぎると変数の値の変化が把握しづらくなってしまい、思わぬエラーに繋がる可能性もあります。値の変化の把握や適切な変数名など開発する際には気を付けることがたくさんあります。
どこでも参照できる様な変数を使用する際には気をつけて書いてください。
【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?
近年プログラミングを勉強する人が増えています。
プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。
多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない
TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。
TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。
本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。
tech boostについて
オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。
tech boost卒業生インタビュー
tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん
tech boostの口コミ
TechBoostお金を払ったかいがあってすごく手厚いサービスで今のところすごく満足。
— Yatsushi@将来宇宙旅行します (@yatsushiGUN) 2019年1月18日
今日もスクールに通ってる人同士の交流会みたいなのもあってすごく有意義に過ごせた。#techboost#プログラミング
@tech_boost のカウンセリング完了!
— kinsu (@waraiotoko8) 2018年8月17日
いやー、ノウハウの宝庫!
カウンセリングだけでも凄い収穫!
プログラミングだけではなく起業や転職支援についても色々聞けた。
即断即決!その場で申し込み完了。
遅くても来年の春までに起業します!
僕の場合、これが現実的な最適解!
全てが楽しみだー!