hiyoko-programingの日記

プログラミングを勉強したてのひよっ子。   エンジニア目指して勉強中。

変数

 変数

変数とは、オブジェクトの入れ物、またはオブジェクトを識別する名札のようなもの。例えば、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文字目でなければ大文字や数字、_(アンダーバー)を使ってもよい

  • 名前にスペースが入ってはいけない

  • 予約語Rubyによって最初から用途を与えられた単語)と同一の名前は使ってはいけない

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つの式は必ず『右側の値を左の変数に代入する』という意味になる」

ということ。これは、どんな場合でも絶対。

https://tech-master.s3.amazonaws.com/uploads/curriculums//f73f816e2195cce65651996387495396.png

 

ターミナル
 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
#変数に代入
  irb(main):001:0> value = "Hello World"
=>"Hello World"
#変数を出力
  irb(main):002:0> puts value
  Hello World
  =>nil
#変数に再代入
  irb(main):003:0> value = "See you" 
=>"See you"
#変数を出力
  irb(main):004:0> puts value
  See you
  =>nil

変数が後から代入したものに書き換わっていることがわかる。
Rubyにおいては、変数にはどんなオブジェクトでも代入でき、文字列を代入したあとに数値を代入することなどもできる。もちろん、変数に対してメソッドを使うこともできる。

なぜ変数を使うのか

 名札としての変数

変数にはオブジェクトが何であるかを識別する名札という役割があります。変数を定義することにより、ソースコード中でオブジェクトをわかりやすく使える。

ターミナル
1
2
3
4
5
#一部省略
    irb(main):001:0> title = "Spider man"
    irb(main):002:0> description = "It is amazing"
    irb(main):003:0> puts title
    irb(main):004:0> puts description

ただ"Spider man"と出力しただけではこれが何の文字列かわからないが、titleという変数に入れることで、この文字列はタイトルなのだとすぐにわかるようになった。

こうしたソースコードの見やすさ(可読性)やわかりやすさは、プログラミングにおいて非常に重要。

また、プログラムの中で同じ値を何度も使う場合、その値を変数にして使うようにすれば、仕様変更でその値を変える必要が生じた場合も変数に代入する箇所を変更するだけで済む。以下は、直径が10の円の、面積と円周を表している。

ターミナル
1
2
3
    # 直径10
    irb(main):001:0> menseki = (10 / 2) * (10 / 2) * 3.14 # 面積
    irb(main):002:0> ensyu = 10 * 3.14 # 円周

このソースコード上では直径を示す「10」が3回も出ている。もし直径を20に変更する場合、10と書いてある箇所をすべて20に訂正するのは大変だし、訂正し忘れる可能性もある。

また、ただ「10」とだけ書かれても何の値かわかりづらいので、上のソースコードを以下のように変更する。

ターミナル
1
2
3
4
5
6
# 直径10
    irb(main):001:0> diameter = 10 
# 面積
    irb(main):002:0> menseki = (diameter / 2) * (diameter / 2) * 3.14 
# 円周
    irb(main):003:0> ensyu = diameter * 3.14

これなら直径を20に変える場合も以下のようにすれば良い。

ターミナル
1
2
3
4
5
6
# 直径を20に変更
    irb(main):001:0> diameter = 20 
 # 面積
    irb(main):002:0> menseki = (diameter / 2) * (diameter / 2) * 3.14
# 円周
    irb(main):003:0> ensyu = diameter * 3.14

可読性も一気に向上した。このように、できるだけ変数を使ってわかりやすいコードを書くよう心がける。

ターミナル
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#変数に値を代入
  irb(main):001:0> name = "takashi"
  =>"takashi"
#文字数を調べる
  irb(main):002:0> name.length               
  =>7
#変数を出力
  irb(main):003:0> puts name
  takashi
  =>nil

 

要点チェック

 

代入した値を固定する

 定数

定数は、基本的には変数と同じくオブジェクトを格納する入れ物です。しかし変数とは違い、一度オブジェクトを代入したら再代入することをしない
定数を定義するときは名前の最初を大文字にする。慣習としては、定数は名前をすべて英大文字にし、定義したあとは再代入しない。

以下は定数の例。

ターミナル
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
# 円周率(定数)
    irb(main):001:0> PI = 3.14
#直径(変数)
    irb(main):002:0> diameter = 10

    irb(main):003:0> puts diameter * PI

    irb(main):004:0> diameter = 50

    irb(main):005:0> puts diameter * PI

では、定数を使ってあなたの干支を出力してみる。

 要点チェック

 

返り値について

Rubyでは、全ての記述が返り値を持つ。ただの文字列オブジェクトやメソッド、比較演算子による式、変数への代入式、そして変数自体など全て。

まずは、一番単純なオブジェクト単体について。オブジェクト単体を書いた場合は、基本的にそのオブジェクト自体が返り値となる。

sample
1
2
3
4
#文字列オブジェクトを書いた場合
"hello"
# => で返り値を示します。返り値はオブジェクト自身です
=> "hello"

続いて、計算が含まれる式については、式の計算結果が返り値となる。

sample
1
2
3
4
#式を書いた場合
1 + 1
#返り値は式の計算結果です
=> 2

次に、メソッドを利用した時については、メソッドの実行結果が返り値となる。

sample
1
2
3
4
#メソッドを利用した場合
"hello".length
#返り値はメソッドの実行結果です
=> 5

メソッドの中でも、putsメソッドの返り値はnilputsメソッドは右の値を出力するメソッドだが、出力と返り値は別ものであることに注意する。

sample
1
2
3
4
5
#putsメソッド
puts "hello"
#出力されるが、返り値はnil
hello
=> nil

=による代入式についても返り値がある。こちらは、代入された値自体。

sample
1
2
3
4
#=による代入式
num = "hello world".length
#返り値は、左の変数に代入された値
=> 11

この辺りのルールは今後非常に大切。

Rubyの記号の読み方

Rubyには様々な記号があるが、これらの読み方は下記のページが参考になる。

Rubyの記号の読み方

https://github.com/JuanitoFatas/what-do-you-call-this-in-ruby