演算子の種類と使い方

今回のレッスンは、演算子について学んでいきます。演算子とは「+」や「!」等を指し、変数への代入や条件分岐、比較などを行う事が出来ます。

吉田先生

演算子には優先順位があり、再定義などが出来ます。そして、重要なのが論理演算子の決まりです。


代入演算子

以下例の「+」や「=」という記号の部分は演算子と呼ばれます。

a = 1
a = a + 1

この例は、まず変数「a」に1を代入しています。変数は、何かが変数に代入されたという時点で作成されるものです。ですので、1行目で変数「a」というものが出来ています。

そこから、2行目で変数「a」と1の足し算が行われ、代入し直され変数「a」の値が変わっていますね。この2行目のコードは、以下のように記述する事も出来ます。

a += 1

「+=」そして、この中の「+=」は代入演算子と呼ばれています。代入演算子とは、二項演算子(a + 1 の部分)と代入がセットになっているもののことです。

論理演算子の応用

論理演算子とは比較を行うなどして、tureかfalseを返してくれるものです。「| |」や「&&」などがあります。では「| |」から見ていきましょう。書き方は以下のようになります。

条件1 || 条件2

これは論理式と呼ばれます。この論理式は1から順にtureかfalseかを判断していきます。論理式自体の真偽は、どちらかが真、もしくはどちらとも真ならば真、それ以外は偽です。

ちなみに論理演算子は2個以上記述する事も可能ですが、読みにくくなってしまったりするので気を付けましょう。また、条件が真とされた時点で論理式の判定も決まるので、それ以降の条件は判定が行われません。では、以下例を実行してみましょう。

1 > 3 || 5 < 10
 #=> true 

これは、「条件1:1は3より大きい」もしくは「条件2:5より10の方が大きい」という論理式ですね。左側から判定されていくので、まず条件1を判定します。falseとなりますね。しかし、条件2がtureです。ですので、tureが返ってくるという事です。

次に論理演算子「&&」について学んでいきましょう。書き方は以下のようになります。

条件1 && 条件2

「||」と同じく1から順に条件が判定されていきますが、こちらの「&&」の場合は条件が両方とも真の場合のみ論理式の結果が真となるので、条件1が偽であれば条件2の判定はされないという事になります。では、以下例を実行してみましょう。

 1 > 3 && 5 < 10
 #=> false 

この論理式は、「条件1:1は3より大きい」かつ「条件2:5より10の方が大きい」という式です。ですので「||」の場合は同じ条件で論理式がtureでしたが、こちらはfalseとなります。

この論理演算子を使用して変数に値を代入するということもできます。では以下例を見ていきましょう。

foo = nil

if foo
  test = foo
else
  test = "テスト"
end
 #=> "テスト" 

こちらは、まず「foo」に「nil」が代入されています。そして、もし「foo」が真の場合は「test」に代入する。「foo」が偽の場合は、「test」に「"テスト"」という値を代入する。という構文です。この構文は「||」を使えば以下のように読みやすく書くことが出来ます。

foo = nil

test = foo || "テスト"
 #=> "テスト" 

また、「||」には代入演算子というものを使った書き方も存在します。書き方は以下のようになります。

foo  ||= "A"

 

これは、以下のコードと同等の意味になります。

foo = foo || "A"

fooがnil、もしくはfalseの場合には、「"A"」を代入するというものです。主に変数にデフォルト値を持たせたい場合に使われます。

このようにコードを短く読みやすく書くということは、「&&」でも可能です。では以下例を見てみましょう。

foo = "あいうえお"

if foo
  test = foo.length
end

p test
 #=> 5 

こちらは、まず「foo」に「"あいうえお"」という文字列が代入されています。そして、もし「foo」が真ならば「test」に「fooの文字数」を代入すると定義しています。「foo」が真であるので「test」への代入がきちんと行われているので「test」も真ということになります。では、これを「&&」を使って書いてみましょう。

foo = "あいうえお"

test = foo && foo.length
 #=> 5 

この場合、「foo」も「foo.length」も真ですが結果として返ってくるのは、「foo.length」の値の方です。これは「&&」が理論式自体の値(結果)は1番最後に判定された条件の値としている為です。

逆に「||」は、論理式の中で最初に真と判定された条件の値が、論理式自体の値として返ってくるので以下のように「"あいうえお"」という結果が返ってきます。

test = foo || foo.length
 #=> "あいうえお" 

更に「&&」は、rubyのバージョンが2.3.0以降であれば「オブジェクト&.メソッド」という風にも書けます。ですので、上記の例ですと

test = foo&.length

と記述できるという事です。これは、「安全参照演算子」や「nilチェック付きメソッド呼び出し」と呼ばれます。

条件演算子

条件判断の構文をこの条件演算子(三項演算子)を使って書くこともできます。書き方は以下のようになります。

条件 ? 式1 : 式2

これを、同じ意味を持つif文に直すと以下のようになります。

if 条件
  式1
else
  式2
end

コードをすっきりとかけるメリットがありますが、場合によっては読みにくくなることもあるのでif文と使い分けていきましょう。では以下例を実行してみましょう。

foo = "fooには値があります"

test = foo ? foo : "fooには値がありません"                                                                                                                    
 #=> "fooには値があります

上記は、もし「foo」が真ならば、「test」に「foo」を代入する。「foo」が偽ならば「"fooには値がありません"」という文字列を代入するというものです。このように条件演算子を使い変数への代入を行う事も出来ます。

範囲演算子

範囲演算子とは、これまでにも何度か出てきましたが範囲を表す「1..5」などの「..」の部分の事です。この「1..5」は範囲オブジェクトと呼ばれており、範囲オブジェクトは「Range」というクラスに属しています。

しかし「Range.new(1..5)」と実行しなくても、「1..5」と記述すると範囲オブジェクトが作成されます。これは文字列オブジェクトも同じですね。

そして、範囲演算子には「..」以外にも「...」というものもあります。まず「..」こちらは例えば「1..5」だとすると、1と5も含め1〜5を範囲内とします。しかし、「1...5」こちらの場合は、1〜4を範囲内とします。5は含まれません。 では、これをプログラムで確認してみましょう。

futatsu = 1..5
mittsu = 1...5

p futatsu.to_a
 #=>[1, 2, 3, 4, 5]

p mittsu.to_a
 #=>[1, 2, 3, 4]

この「to_a」というのはオブジェクトの中身で配列を作り返してくれるメソッドです。これを使えば、範囲に何が含まれているか上記のように確認できますね。

ちなみに、例では数値を使っていましたが文字列でも範囲オブジェクトを作成出来ます。「"a".."c"」として、「to_a」メソッドを実行すると以下のような結果になります。

p ("a".."c").to_a
 #=> ["a", "b", "c"]

優先順位

演算子には優先順位が存在します。例えば算数で「1+2×2」という式があったとき、掛け算を先に行い掛け算の答え+1としますよね。これと同じように優先順位がありその順番に従い演算子が呼び出されるのです。では優先順位を見てみましょう。

優先順位が高い

: :
[ ]
①+ ②! ③~
**
①* ② / ③%
①+(四則演算) ②-(四則演算)
① << ② >>
①| ②^
① > ② >= ③ < ④ <=
① <=> ② == ③ === ④!= ⑤ =~ ⑥!~
&&
||
?:
.. ...
= (①+= ② -= ③ *= ④ /=)
not
① and ② or

優先順位が低い

この順番を絶対に守らなければいけないという訳ではありません。算数と同じように「 ( )」で囲えば先に計算してくれます。

定義する

rubyの演算子の中にはメソッドとされているものがあります。ですので、以下の演算子以外であればメソッドですので定義や変更が可能です。

メソッドではない演算子

::  &amp;&amp;  ||  ..  ...  ?:  not  =  and  or

二項演算子

以下のような足し算などで使われる「+」演算子等は自分で定義する事が出来ます。

1 + 2

定義の仕方は以下のようになります。

def 演算子(引数)
 処理
end

では、実際に定義してみましょう。

class C
  def +
    p "プラス"
  end
end

test = C.new
p test.+
 #=>"プラス"

文字列を返すメソッドとして定義できていますね。

単項演算子

単項演算子とは、「+」「-」「~」「!」などです。そしてこの4つの演算子はメソッドとして前項目のように定義する事が出来ます。これは、既に存在しているメソッドを再定義する形となります。そういった場合は、「+@」「-@」「~@」「!@」とアットマークを使い再定義する事が出来ます。

添字メソッド

配列やハッシュなどの中の要素を指定して取り出したいときには、

配列名[添字]

という形で取り出します。また、配列やハッシュの中の要素を変更したい場合は、

配列名[添字] = 

とします。この配列名[添字]や配列名[添字] = 値を添字メソッドといいます。では、例を見てみましょう。

array = ["あ", "い", "う"]

array[2]
 #=>"う"

array[2] = "す"

array
 #=>["あ", "い", "す"]

「"あ", "い", "う"」という文字列オブジェクトの集まり、つまり配列を1行目で定義しています。そして、配列の中の要素を1つ指定し呼び出しています。

配列の要素の呼び出しは、例の様に数字で指定します。3番目の要素なのに2となっているのは、0から数えられている為です。例では、添字メソッドを使い3番目の要素を呼び出しています。

そして、添字メソッドで値を変更していますね。最後に配列を呼び出すときちんと値が変更されているのが分かると思います。

まとめ

今回は演算子について学びました。演算子とは「+」や「!」等を指し、変数への代入や条件分岐、比較などを行う事が出来ます。また、演算子には優先順位があること、再定義などが出来ることも学びましたね。そして、重要なのが論理演算子の決まりです。

・左側から順番に真偽が判定されていく

・論理式自体の真偽が決定すると、以降の条件は判定されない

・1番最後に判定された条件の値=論理式自体の値

無料ビデオ講座のお知らせ

Skillhub [スキルハブ]では無料の動画講座を多数公開しています。他校だと数万円するような講座が無料で受講できます。

無料講座一覧を見る

×