【Ruby】代入演算子の書き方と使い方の基本
開発環境
- Ruby version: ruby 3.1.2
Rubyの代入演算子とは
Rubyの代入演算子とは、変数などへの値を設定、定数やローカル変数の宣言として用いられる演算子式です。 基本的な代入演算子は「=」で左辺に右辺を代入することができますが、「=」と他の演算子を組み合わせた自己代入演算子もあります。 また、足し算や引き算など様々な演算子を組み合わせて代入する演算子のことを複合代入演算子といいます。 公式リファレンス:https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html
Rubyの代入演算子の書き方
Rubyの代入演算子の書き方は下記になります。
1式1 代入演算子 式2
代入演算子の一覧
Rubyで定義されている代入演算子の一覧は下記となります。
1a = b # a に b を代入する 2a += b # a = a + b と同じ 3a -= b # a = a - b と同じ 4a *= b # a = a * b と同じ 5a /= b # a = a / b と同じ 6a %= b # a = a % b と同じ 7a **= b # a = a ** b と同じ 8a &= b # a = a & b と同じ 9a |= b # a = a | b と同じ 10a ^= b # a = a ^ b と同じ 11a <<= b # a = a << b と同じ 12a >>= b # a = a >> b と同じ 13a &&= b # a && (a = b) と同じ 14a ||= b # a || (a = b) と同じ
Rubyにおいては「a++」という加算子(インクリメント)、「a--」という減算子(デクリメント)などのインクリメント演算子は定義されていないため、代わりに「+=」「-=」を利用します。
代入演算子の優先順位
Rubyの演算子には優先順位があります。
1(優先順位が高い) 2:: 3[] 4+(単項) ! ~ 5** 6-(単項) 7* / % 8+ - 9<< >> 10& 11| ^ 12> >= < <= 13<=> == === != =~ !~ 14&& 15|| 16.. ... 17?:(条件演算子) 18=(+=, -= ... ) 19not 20and or 21(優先順位が低い)
1つの式の中で複数の演算が行われるとき、式の各部分は一定の順序に従って評価されます。 例えば、代入演算子は優先順位が低いため、他の演算子のほうが優先順位が高く評価されます。 そのため、他の演算子と組み合わせた処理を行う場合、上記の優先順位を念頭に入れておかないと想定した通りの動作にならない場合もあるので注意しましょう。
代入演算子の再定義できない演算子一覧
Rubyにはオーバーライド(再定義)できない演算子(制御構造)の一覧として下記が定義されています。
1= ?: .. ... not && and || or ::
上記に加えて「+=」や「-=」などの自己代入演算子もオーバーライド(再定義)はできないため、上記を念頭に入れておかないと想定した通りの動作にならない場合もあるので注意しましょう。
Rubyの代入演算子の使い方
Rubyの代入演算子の使い方について解説していきます。
代入演算子で変数に値を代入する使い方
まずは基本的な代入演算子で変数に値を自己代入する使い方について、サンプルコードです。
1num = 10 2puts num # => 結果は「10」になります。 3 4num = 100 5puts num # => 結果は「100」になります。
上記は変数numに10という数字が代入されているため、2行目の出力結果は「10」となります。 また、3行目で変数numに100という数字が代入されて上書きされているため、4行目の出力結果は「100」となります。
代入演算子で変数に自己代入する使い方
次に代入演算子で変数に自己代入する使い方について、サンプルコードです。
1num1 = 10 2num2 = 3 3puts num1 += num2 # => 13 「num1 = num1 + num2」 と同じ 4 5num1 = 10 6num2 = 3 7puts num1 -= num2 # => 7 「num1 = num1 - num2」 と同じ 8 9num1 = 10 10num2 = 3 11puts num1 *= num2 # => 30 「num1 = num1 * num2」 と同じ 12 13num1 = 10 14num2 = 3 15puts num1 /= num2 # => 3 「num1 = num1 / num2」 と同じ 16 17num1 = 10 18num2 = 3 19puts num1 %= num2 # => 1 「num1 = num1 % num2」 と同じ 20 21num1 = 10 22num2 = 3 23puts num1 **= num2 # => 1000 「num1 = num1 ** num2」 と同じ
基本的な算術演算子も代入演算子を用いることにより、変数num1を2回記述することなく自己代入することができます。 また、自己代入演算子には論理演算子のand条件もあります。
1num1 = nil 2num2 = 10 3puts num1 &&= num2 # => 結果はnil 「num1 && (num1 = num2) 」と同じ 4 5num1 = 3 6num2 = 10 7puts num1 &&= num2 # => 結果は10 「num1 && (num1 = num2) 」と同じ
上記は左辺のnum1がtrueなら右辺を代入するという処理になります。 また、自己代入演算子には論理演算子のor条件もあります。
1num1 = nil 2num2 = 10 3puts num1 ||= num2 # => 結果は10 「num1 || (num1 = num2) 」と同じ 4 5num1 = 3 6num2 = 10 7puts num1 ||= num2 # => 結果は3 「num1 || (num1 = num2) 」と同じ
上記は左辺のnum1がfalse(または未定義や存在しないも含む)なら右辺を代入するという処理になります。
様々な演算子を組み合わせた複合代入演算子の使い方
最後に、様々な演算子を組み合わせた複合代入演算子の使い方について、サンプルコードです。
1items = [ 2 {goods: "スウェットシャツ", price: 2980, amount: 1, sale_price: 1980}, 3 {goods: "靴下", price: 280, amount: 3, sale_price: nil}, 4 {goods: "インナーシャツ", price: 1280, amount: 1, sale_price: 980}, 5 {goods: "スウェットパーカー", price: 3980, amount: 2, sale_price: nil}, 6] 7total = 0 8 9items.each do |item| 10 total += (item[:sale_price] ||= item[:price]) * item[:amount] 11end 12 13puts "合計金額は#{total}円です。"
ECサイトなどによくある合計金額を求める処理になります。 それぞれの価格については、セール価格が設定されていなければ定価、セール価格が設定されている場合はセール価格になるように「||=」自己代入演算子で処理をしています。 あとは「*」算術演算子で購入した品数を掛け算し、「+=」自己代入演算子で変数totalに自己代入していくという処理で合計金額を求めています。
おわりに
Rubyの代入演算子の使い方を解説してきました。 自己代入演算子を用いることで代入する時に他の演算子も同時に処理することができ得るため、自己代入を簡潔に記述することができます。 演算子をできるだけシンプルに記述できるように自己代入演算子を使いこなしていきましょう。