変数
変数
変数とは、オブジェクトの入れ物、またはオブジェクトを識別する名札のようなもの。例えば、helloworld.rbで"Hello World"という文字列を作った。そしてこの文字の数を数えたかったため、length
メソッドを利用した。
1 2 3 |
#"Hello World"の文字数を数える
irb(main):001:0> "Hello World".length
=>11
|
11という値が返ってきた。では、この値を保持し、3回、4回と利用するにはどうすれば良いのか?毎回"Hello World".length
と記述するのは、ちょっと面倒。
ここで役に立つのが変数。
変数の宣言
変数は以下のように宣言する。=
を挟んで右側においたオブジェクトの返り値を、左側の変数の中に入れるイメージ。
1 |
変数 = 格納するオブジェクト
|
変数の名前は、原則として小文字から始める。
1 2 3 4 5 6 7 8 9 10 |
#numberという変数の中身を、"Hello World".lengthの結果である11と定義する
irb(main):001:0> number = "Hello World".length
#numberを実行すると、格納された11が出力される
irb(main):002:0> puts number
11
=>nil
#何度実行しても、格納された11が出力される
irb(main):003:0> puts number
11
=>nil
|
puts number
を実行するだけで11が出力されており、puts "Hello World".length
よりも短く記述できる。
ちなみに、putsの返り値は「nil」となる。これは、オブジェクトが何もない、という意味。
変数の命名規則
変数を宣言する際にはいくつかのルールが存在する。
-
原則、小文字から始める
(_(アンダーバー)から始めることも可能ですが、特に理由がない場合は避ける。) -
名前の1文字目でなければ大文字や数字、_(アンダーバー)を使ってもよい
-
名前にスペースが入ってはいけない
1 2 3 4 5 6 7 8 9 |
#良い例
number = 100
dog = "ワンワン"
message_1000_AM = "午前10時ちょうどをお知らせします。"
#悪い例
bad number = 666 #スペースが入っているので×
do = "ワンワン" #doという予約語は存在しているので×
1000_AM_message = "午前10時ちょうどをお知らせします。" #数字から始まっているので×
|
代入
変数のあとの=(イコール)は数学の方程式のように等しいという意味ではなく、代入するという意味。
プログラミングにおける=
の意味
重要なポイントは、
「Rubyにおいて=
が1つの式は必ず『右側の値を左の変数に代入する』という意味になる」
ということ。これは、どんな場合でも絶対。
1 2 3 4 5 6 7 8 9 10 |
#numberという変数の中身を、"Hello World".lengthの結果である11と定義する
irb(main):001:0> number = "Hello World".length
#numberを実行すると、格納された11が出力される
irb(main):002:0> puts number
11
=>nil
#何度実行しても、格納された11が出力される
irb(main):003:0> puts number
11
=>nil
|
上の例で行っている処理は、「numberという変数に"Hello World".lengthの返り値である数値11を代入する」ということになる。
すると、変数numberの返り値は、数値オブジェクト11となる。
すなわち、puts
メソッドをnumber
に対して行えば「11」とターミナル上に出力される、ということ。
再代入
一回オブジェクトを代入したあとの変数に、別のオブジェクトを再び代入することもできる。
プログラム中に何度でも変更可能であることも変数の特徴。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
変数が後から代入したものに書き換わっていることがわかる。
Rubyにおいては、変数にはどんなオブジェクトでも代入でき、文字列を代入したあとに数値を代入することなどもできる。もちろん、変数に対してメソッドを使うこともできる。
なぜ変数を使うのか
名札としての変数
変数にはオブジェクトが何であるかを識別する名札という役割があります。変数を定義することにより、ソースコード中でオブジェクトをわかりやすく使える。
1 2 3 4 5 |
ただ"Spider man"と出力しただけではこれが何の文字列かわからないが、titleという変数に入れることで、この文字列はタイトルなのだとすぐにわかるようになった。
こうしたソースコードの見やすさ(可読性)やわかりやすさは、プログラミングにおいて非常に重要。
また、プログラムの中で同じ値を何度も使う場合、その値を変数にして使うようにすれば、仕様変更でその値を変える必要が生じた場合も変数に代入する箇所を変更するだけで済む。以下は、直径が10の円の、面積と円周を表している。
1 2 3 |
このソースコード上では直径を示す「10」が3回も出ている。もし直径を20に変更する場合、10と書いてある箇所をすべて20に訂正するのは大変だし、訂正し忘れる可能性もある。
また、ただ「10」とだけ書かれても何の値かわかりづらいので、上のソースコードを以下のように変更する。
1 2 3 4 5 6 |
これなら直径を20に変える場合も以下のようにすれば良い。
1 2 3 4 5 6 |
可読性も一気に向上した。このように、できるだけ変数を使ってわかりやすいコードを書くよう心がける。
1 2 3 4 5 6 7 8 9 10 |
代入した値を固定する
定数
定数は、基本的には変数と同じくオブジェクトを格納する入れ物です。しかし変数とは違い、一度オブジェクトを代入したら再代入することをしない。
定数を定義するときは名前の最初を大文字にする。慣習としては、定数は名前をすべて英大文字にし、定義したあとは再代入しない。
以下は定数の例。
1 2 3 4 5 6 |
#定数に代入
irb(main):001:0> CONST = "Hello World"
#定数を出力
irb(main):002:0> puts CONST
Hello World
=>nil
|
定数に再代入しようとすると、以下のように警告が出ます。
【例】
1 2 3 4 5 6 7 8 9 10 |
#定数に代入
irb(main):001:0> CONST = "Hello World"
#定数を出力
irb(main):002:0> puts CONST
Hello World
=>nil
#再代入すると警告が出る
irb(main):003:0> CONST = "Hello Japan"
warning: already initialized constant COUNT
warning: previous definition of COUNT was here
|
変数と比べて少し窮屈な気がするが、再代入しないとわかっているオブジェクト、または再代入してはいけないオブジェクトには定数を使う。例えば以下の例では、円周率は絶対に変わらない数値なので、定数にしている。
1 2 3 4 5 6 7 8 9 10 |
では、定数を使ってあなたの干支を出力してみる。
要点チェック
返り値について
Rubyでは、全ての記述が返り値を持つ。ただの文字列オブジェクトやメソッド、比較演算子による式、変数への代入式、そして変数自体など全て。
まずは、一番単純なオブジェクト単体について。オブジェクト単体を書いた場合は、基本的にそのオブジェクト自体が返り値となる。
1 2 3 4 |
#文字列オブジェクトを書いた場合
"hello"
# => で返り値を示します。返り値はオブジェクト自身です
=> "hello"
|
続いて、計算が含まれる式については、式の計算結果が返り値となる。
1 2 3 4 |
#式を書いた場合
1 + 1
#返り値は式の計算結果です
=> 2
|
次に、メソッドを利用した時については、メソッドの実行結果が返り値となる。
1 2 3 4 |
#メソッドを利用した場合
"hello".length
#返り値はメソッドの実行結果です
=> 5
|
メソッドの中でも、puts
メソッドの返り値はnil
。puts
メソッドは右の値を出力するメソッドだが、出力と返り値は別ものであることに注意する。
=
による代入式についても返り値がある。こちらは、代入された値自体。
1 2 3 4 |
#=による代入式
num = "hello world".length
#返り値は、左の変数に代入された値
=> 11
|
この辺りのルールは今後非常に大切。
Rubyの記号の読み方
Rubyには様々な記号があるが、これらの読み方は下記のページが参考になる。
https://github.com/JuanitoFatas/what-do-you-call-this-in-ruby