こんにちは。Tomoyuki(@tomoyuki65)です。
みなさん、変数というのを聞いたことはありますか?
プログラミング初心者がまず覚えなけれならないものですよね。
他のプログラミングを学んだことがある方は、変数は箱のようなものと教えられた人も多いのではないでしょうか?
でも、Rubyでは箱のようなものと覚えてはいけません!
この記事では、そんなRubyにおける変数や、定数について解説します。
変数とは?
変数は、他のプログラミング言語ではデータを入れる「箱のようなもの」と教えられることが多いです。
しかし、Rubyの変数で「箱のようなもの」と覚えてしまうと、バグを生み出してしまう危険性があります。
Rubyの変数は、データにつける『ラベルのようなもの』と覚えるのが適切です。
Rubyでは、この『ラベル』という表現を理解することが重要です。
変数名の付け方
変数名の付け方を説明します。Rubyの変数名の付け方にはルールがあります。
まずは基本となる『ローカル変数』を覚えましょう。
ローカル変数は、「英小文字」または「_(アンダーバー)」から始まる名前を付けます。
ローカル変数とは、特定の有効範囲内で使用することができる変数のことです。
変数のイメージ
上記の図は、変数についてのイメージ図です。
図では名前がついている箱が4つ書かれています。これらはそれぞれ、オブジェクトであることを表しています。
つまり、数値の「1」や文字列の「Hello World !」、そして変数の「num」や「str」は全てオブジェクトです。
オブジェクトの説明は難しいためここでは割愛しますが、オブジェクト=物体とイメージすると良いでしょう。
このようにRubyではほぼ全てのものがオブジェクトでできています。
そのため、図のようにプログラム上で「num = 1」と定義した場合、数値「1」というオブジェクトに、「num」というオブジェクトを紐付けていることを表しています。
変数「num」は数値「1」を参照していることを表すため、変数は『ラベルのようなもの』という表現が適切です。
例えば、文字列「Hello World !」の変数名を「str」とし、それをログ出力させたい場合、以下のように書きます。
ここで「print」という定義がありますが、これはログ出力をするための命令の一つです。
str = "Hello World !"
print str
上記のプログラムを実行すると、以下の結果が出力されます。
ローカル変数のスコープについて
ローカル変数は、先ほど特定の有効範囲内で使用することができる変数と説明しました。
この変数の有効範囲のことを「スコープ」と呼びます。
例えば、以下のプログラムを実行してみて下さい。
尚、def〜endで記述されている部分は関数のようなもので、メソッドと呼びます。
# ローカル変数「str」
str = "こんにちは。"
# メソッド「say」を定義
def say
print str
end
# メソッド「say」を実行
say
実行結果はエラーになりますよね。
上記の例では、メソッド内で変数「str」を呼び出そうとしています。
ただし、「str」はメソッドの外で定義されているローカル変数のため、呼び出せずにエラーとなります。
このように、ローカル変数は定義した場所の有効範囲内でのみ使用できる変数です。
グローバル変数を使ってみよう
ローカル変数は有効範囲内がありましたが、グローバル変数であれば定義した場所に関わらず呼び出すことができます。
では先ほどエラーになったプログラムのローカル変数「str」を、グローバル変数にしてみましょう。
グローバル変数を定義するには、変数名の一番初めに「$」を付けます。
では以下のプログラムを実行してみて下さい。
# グローバル変数「$str」
$str = "こんにちは。"
# メソッド「say」を定義
def say
print $str
end
# メソッド「say」を実行
say
実行結果の通り、グローバル変数は定義した場所に関わらず呼び出すことができ、とても便利です。
ただし、名前を付ける際には重複しないように注意が必要になります。
グローバル変数はプログラム全体のどこからでも参照や変更ができるため、大きいプログラムでは流れを追ったり、修正を加えるのが大変になります。
そのため、あまり好んで使わない方が良いことを覚えておいて下さい。
定数
次は定数について説明します。
定数も変数と同じようにラベルのようなものです。
ただし定数の場合は、値を書き換えたくないデータにつけるラベルです。
定数名の付け方にも変数と同じようにルールがあります。
定数名は、名前の最初の文字を英大文字から始めます。
ただし、慣習として全て英大文字の名前を付けます。
例として、以下のプログラムを実行してみて下さい。
以下の例ではprintの代わりに「puts」という定義を使いました。これもログ出力の命令ですが、printとの違いは末尾に改行が付与されます。
# 税率を表す定数を定義
ZEIRITU = 0.08
# 定数「ZEIRITU」を表示
puts ZEIRITU
# 定数を変更する。
ZEIRITU = 0.1
# 定数「ZEIRITU」を表示
puts ZEIRITU
実行結果は以下の通りです。(paiza.ioで確認した場合)
警告メッセージが出力されました。
定数は、先ほど値を書き換えたくないデータに使うと説明しましたよね。
このように、定数は一度定義した後に値を変更しようとすると警告になります。
ではpaiza.ioを使用している場合は、上記図のようタブの「出力」をクリックしてみて下さい。
出力結果には、最初に定義したZEIRITU「0.08」だけでなく、変更後のZEIRITU「0.1」も出力されています。
このように、Rubyでは警告があっても処理が止まらず、最後まで実行されることを覚えておいて下さい。
上記のプログラム例では、定数は意味のあるデータ(今回の例では税率を「ZEIRITU」とした)に使用していますよね。
例えば仕様が変更となり、税率が「0.08」から「0.1」に変更しなければならなくなった場合はどうでしょうか。
その場合は、以下のように定数の値のみ修正すれば、後続の処理に変更を加えることなくプログラムを修正できますよね。
# 税率を表す定数を定義
# Modify-START 税率を「0.1」に変更する
#ZEIRITU = 0.08
ZEIRITU = 0.1
# Modify-END
# 定数「ZEIRITU」を表示
puts ZEIRITU
このように、定数は値を書き換えたくない値や、何らかの意味を表す値に使います。
まとめ
- Rubyでの変数は「ラベルのようなもの」と覚える
- 英小文字か_(アンダーバー)から始まる変数をローカル変数と呼ぶ(慣習として全て小文字を使う)
- ローカル変数は定義した場所の有効な範囲内(スコープ)でのみ使用可能
- $から始まる変数をグローバル変数と呼ぶ
- グローバル変数は定義した場所に関わらずどこからでも使用可能
- 定数は値を書き換えたくないデータに付けるラベルのようなもの
- 定数は意味のあるデータを表す際に使用する
- 定数名は英大文字から始める。(慣習として全て大文字を使う)
- 関連記事
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- 【スト6】モダンキャミィの初心者向けコンボまとめ【STREET FIGHTER 6(ストリートファイター6)】 - 2024年11月10日
- モンハンワイルズでおすすめのオプション設定まとめ【Monster Hunter Wilds】 - 2024年11月4日
- モンハンワイルズでおすすめのグラフィック設定まとめ【Monster Hunter Wilds】 - 2024年11月2日
コメントを残す