さらなる高みへ -higher ground -

プログラミング学習の定着を狙いとしたアウトプット(独り言)をしてみるブログ

Rubyの基本概念③ -演算子と変数-

演算子と変数

続いてRubyでアプリケーションを作成する前に必要な基礎知識である演算子と変数についてもおさらいする。

演算子

Ruby演算子

Rubyで一般的な計算処理をする場合、以下の様な数式記号が使える。

  • +(足し算)
  • -(引き算)
  • * (かけ算)
  • /(割り算)
  • %(剰余)

使い方は普通の算数と同じであるが、剰余とは例えば、「17を5で割った余り」を求めるようなことである。

#足し算
  2.4.0 :001 > 1000 + 2000
  =>3000
#引き算
  2.4.0 :002 > 3000 - 1500
  =>1500
#掛け算
  2.4.0 :003 > 50 * 40
  =>2000
#割り算
  2.4.0 :004 > 600 / 15
  =>40
#5 ÷ 2をした余り
  2.4.0 :005 > 5 % 2
  =>1
比較演算子(>, <, ==)

比較演算子は、値同士を比較するときに使用する。
実行すると、以下のような結果になります。

#20は1より大きいか?
2.4.0 :001 > 1 < 20
=>true
#1は20より大きいか?
2.4.0 :002 > 1 > 20
=>false
#2 × 5は10と等しいか?
2.4.0 :003 > 2 * 5 == 10
=>true
#10は20と等しいか?
2.4.0 :004 > 10 == 20
=>false

比較演算子を使った場合の返り値は、式が正しければtrue、間違っていればfalseという結果になる。
それぞれ文字列の"true", "false"とは別の、「真を示すオブジェクト」と「誤を示すオブジェクト」である。
また、値同士が等しいかを確かめる場合は、「= が2つであること」に留意が必要である。

比較演算子(>=, <=)

比較演算子>や<のあとに=を続けることで〜以上、〜以下を表すことができる。

#2 × 3は6以上か? 2.4.0 :001 > 2 * 3 >= 6 =>true #2 × 3は6より大きいか? 2.4.0 :002 > 2 * 3 > 6 =>false #4 × 5は20以下か? 2.4.0 :003 > 4 * 5 <= 20 =>true #4 × 5は6より小さいか? 2.4.0 :004 > 4 * 5 < 6 =>false

not演算子(!)

「!(エクスクラメーションマーク)」はnot演算子と呼ばれ、否定の意味で使われる。
!と=を合わせた「!=」は「==」と反対の意で、値同士が等しくない場合にtrueを返す。

#2 × 3 は6ではないか?
  2.4.0 :001 > 2 * 3 != 6
  =>false
#2 × 3 は10ではないか?
  2.4.0 :002 > 2 * 3 != 10
  =>true

変数

Rubyのプログラム上では、自分自身で文字列や数値などのオブジェクトを生み出すことができる。
しかし、その値を保持し利用し続けるためには、オブジェクトに名前をつけておく必要がある。
そこでオブジェクトをプログラム中で繰り返し呼び出したい時に利用するのが、「変数」である。

変数とは、オブジェクトの入れ物、またはオブジェクトを識別する名札のようなものである。

例えば、前回の投稿で"Hello World"という文字列を作り、この文字の数を数えたかった時にlengthメソッドを利用した。
11という値が返ってきたが、ではこの値を保持し、3回、4回と利用するにはどうすれば良いだろうか?
毎回"Hello World".lengthと記述するのは、面倒である。 ここで役に立つのが「変数」となる。

変数の宣言

変数の宣言変数は以下のように宣言する。
=を挟んで右側においたオブジェクトの返り値を、左側の変数の中に入れるイメージである。

 変数 = 格納するオブジェクト

 具体的には、

#numberという変数の中身を、"Hello World".lengthの結果である11と定義する
  2.4.0 :001 > number = "Hello World".length

#numberを実行すると、格納された11が出力される
  2.4.0 :002 > puts number      
  11
  =>nil

#何度実行しても、格納された11が出力される
  2.4.0 :003 > puts number
  11
  =>nil

一度number = "Hello World".lengthで宣言された変数(number)を、次の行からはputs numberを実行するだけで11が出力されているのが分かる
puts "Hello World".lengthよりも短く記述できる。

ちなみに、putsの返り値は「nil」となるが、これは「オブジェクトが何もない」という意味である。

変数の命名規則

変数を宣言する際にはいくつかのルールが存在する。

  • 原則、小文字から始める
  • 名前の1文字目でなければ大文字や数字、_(アンダーバー)を使ってもよい
  • 名前にスペースが入ってはいけない
  • 予約語Rubyによって最初から用途を与えられた単語)と同一の名前は使ってはいけない
    RubyのプログラムをSublime Textで記述する場合、予約語はごく一部を除いて自動で赤色に変わる)
#良い例
  number = 100
  dog = "ワンワン"
  message_1000_AM = "午前10時ちょうどをお知らせします。"

#悪い例
  bad number = 666  #スペースが入っているので×
  do = "ワンワン" #doという予約語は存在しているので×
  1000_AM_message = "午前10時ちょうどをお知らせします。"  #数字から始まっているので×

代入

変数のあとの=(イコール)は数学の方程式のように等しいという意味ではなく、代入するという意味になる。

Rubyにおいて=が1つの式は必ず『右側の値を左の変数に代入する』という意味になる」ということは絶対のルールとして覚えておきたい。

#numberという変数の中身を、"Hello World".lengthの結果である11と定義する
  2.4.0 :001 > number = "Hello World".length

#numberを実行すると、格納された11が出力される
  2.4.0 :002 > puts number      
  11
  =>nil

#何度実行しても、格納された11が出力される
  2.4.0 :003 > puts number
  11
  =>nil

この例で行っている処理は、「numberという変数に"Hello World".lengthの返り値である数値11を代入する」ということになる。
すると、変数numberの返り値は、数値オブジェクト11となる。

つまり、putsメソッドをnumberに対して行えば「11」とターミナル上に出力される、ということである。

再代入

一回オブジェクトを代入したあとの変数に、別のオブジェクトを再び代入することもできる。
プログラム中に何度でも変更可能であることも変数の特徴である。

#変数に代入
  2.4.0 :001 > value = "Hello World"
=>"Hello World"

#変数を出力
  2.4.0 :002 > puts value
  Hello World
  =>nil

#変数に再代入
  2.4.0 :003 > value = "See you" 
=>"See you"

#変数を出力
  2.3.0 :004 > puts value
  See you
  =>nil

 

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

返り値について

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

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

#文字列オブジェクトを書いた場合
"hello"

# => で返り値を示します。返り値はオブジェクト自身です
=> "hello"

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

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

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

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

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

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

#putsメソッド
puts "hello"

#出力されるが、返り値はnil
hello
=> nil