Ruby入門 - 演算子

トップ > Ruby入門 > 演算子

代数演算子(+, -, *, /, %, *)

下記の代数演算子が定義されています。

+a            # 正数
-a            # 負数
a + b         # 加算
a - b         # 減算
a * b         # 乗算
a / b         # 除算
a % b         # a を b で割った余り
a ** b        # a の b 乗

Ruby には a++ や ++a のような加算子(インクリメント)、減算子(デクリメント)はありません。代わりに +=, -= を用います。

a += 1        # a の値をひとつ加算する
a -= 1        # a の値をひとつ減算する

文字列演算子(+, <<, *, %)

文字列を連結するには、+ を用いる方法と <> を用いる方法があります。後者の方が高速です。

str1 + str2       # 文字列str1とstr2を連結(遅い、str1自体は変更無し)
str1 << str2      # 文字列str1とstr2を連結(高速、str1自体が変更される)
str1 * n          # 文字列str1を n回繰り返した文字列

% は、printf() のフォーマットで引数を整形します。

puts "%d" % 127      #=> 127
puts "%x" % 127      #=> 7f
puts "%o" % 127      #=> 177
puts "[%5d]" % 127   #=> [  127]

ビット演算子(~, &, |, ^, <<, >>, [])

下記のビット演算子が定義されています。

~a            # a の否定(1は0、0は1)
a & b         # ビット積(aもbも1のビットが1)
a | b         # ビット和(aまたはbが1のビットが1)
a ^ b         # 排他的論理和(aまたはbどちらかが1の時のみ1)
a << b        # b ビット左シフト
a >> b        # b ビット右シフト
a[n]          # nビット目が立っていれば1、さもなくば0

代入演算子(=, +=, -=, *=, /=, %=, **=, &=, |=, ^=, <<=, >>=)

下記の代入演算子が定義されています。

a = b         # a に b を代入する
a += b        # a = a + b に同じ
a -= b        # a = a - b に同じ
a *= b        # a = a * b に同じ
a /= b        # a = a / b に同じ
a %= b        # a = a % b に同じ
a **= b       # a = a ** b に同じ
a &= b        # a = a & b に同じ
a |= b        # a = a | b に同じ
a ^= b        # a = a ^ b に同じ
a <<= b       # a = a << b に同じ
a >>= b       # a = a >> b に同じ
a &&= b       # a && (a = b) に同じ
a ||= b       # a || (a = b) に同じ

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

下記の比較演算子が定義されています。

a == b        # a と b が等しい
a != b        # a と b が等しくない
a < b         # a が b よりも小さい
a > b         # a が b よりも大きい
a <= b        # a が b 以下である
a >= b        # a が b 以上である

<=> 演算子は、a < b であれば -1、a == b であれば 0、a > b であれば 1、比較できない時は nil を返します。

a <=> b

=== 演算子は、case文のマッチングで用いられる比較を行います。例えば数値(Numeric)の場合は数値が等しいか、範囲(Range)の場合はその範囲内にあるか、正規表現(Regexp)の場合は正規表現にマッチするか、モジュール(Module)の場合はオブジェクトがサブクラスのインスタンスであるかどうかなどが判断されます。

if 5 === 5 then               # Numeric
  puts "OK"
end

if (1..10) === 5 then         # Range
  puts "OK"
end

if /[a-z]/ === "a" then       # Regexp
  puts "OK"
end

if String === "a" then        # Module
  puts "OK"
end

論理演算子(!, &&, ||, not, and, or)

下記の論理演算子が定義されています。

!a                   # a が false であれば
a && b               # a かつ b が true であれば
a || b               # a または b が true であれば
not a                # a が false であれば
a and b              # a かつ b が true であれば
a or b               # a または b が true であれば

三項演算子(? :)

? : は三項演算子と呼ばれます。

a ? b : c            # a が真であれば b さもなくば c

配列演算子(+, -, &, *, <<, ==, [])

配列(Array)に関しては、下記の演算子が定義されています。

arr1 + arr2          # arr1 と arr2 を連結した配列
arr1 - arr2          # arr1 から arr2 の要素を取り除いた配列
arr1 * n             # arr1 の各要素を n 回繰り返した配列
arr1 * sep           # arr1 の各要素をセパレータ sep で連結した文字列
arr1 & arr2          # arr1 と arr2 双方に含まれる要素からなる配列
arr1 << obj          # arr1 に要素 obj を追加した配列
arr1 == arr2         # arr1 と arr2 が等しければ true さもなくば false
arr1 <=> arr2        # arr1 と arr2 が等しければ 0、大きければ 1、小さければ -1
arr1[n]              # arr1 の n番目の要素
arr1[n..m]           # arr1 の n~m番目の要素からなる配列
arr1[n, len]         # arr1 の n番目から len個の要素からなる配列
arr1[n] = val        # arr1 の n番目の要素を val で置換
arr1[n..m] = val     # arr1 の n~m番目の要素を val で置換
arr1[n, len] = val   # arr1 の n番目から len個の要素を val で置換

ハッシュ演算子(==, ===, [])

ハッシュ(Hash)に関しては、下記の演算子が定義されています。

hash1 == hash2       # hash1 と hash2 の要素がすべて等しければ true
hash1 === hash2      # hash1 と hash2 の要素がすべて等しければ true
hash1[key]           # hash1 の中の keyに関連付けられた値
hash1[key] = val     # hash1 の中の keyに関連付けられた値を valで置換

正規表現演算子(=~, !~)

正規表現(Regexp)に関しては、下記の演算子が定義されています。

reg =~ str           # 正規表現 reg に str がマッチすれば
reg !~ str           # 正規表現 reg に str がマッチしなければ

演算子一覧

Object(==, ===, =~)
  Array(+, -, *, &, <<, <=>, ==, [], []=)
  Hash(==, ===, [], []=)
  String(%, *, +, <<, <=>, ==, =~, [], []=)
  Numeric(+, -, <=>)
    Float(+, -, *, /, %, **, ==, <, >, <=, >=, <=>)
    Integer(**, /)
      Bignum(+, -, *, /, %, **, ==, <=, >=, <=>, <<, >>, [], &, |, ^, ~)
      Fixnum(+, -, *, /, %, **, ==, <=, >=, <=>, <<, >>, [], &, |, ^, ~)
  Range(==, ===)
  Regexp(==, ===, =~)

Copyright(C) 2014 杜甫々
初版:2014年12月30日、最終更新:2014年12月30日
http://www.tohoho-web.com/ruby/operators.html