【一人 Ruby Advent Calendar 2017】Ruby の演算子について【12日目】

一人 Ruby Advent Calendar 2017 12日目の記事になります。 今回は演算子について簡単に。

Ruby演算子ってなに?

さて、プログラミング言語では +==<< などなど様々な演算子があります。
Ruby ではこれらの演算子は『メソッド』として定義されています。

# .+ という名前のメソッドを呼び出す
p 1.+ 2
# => 3

# #send 経由で呼び出したり
p 1.send(:==, 3)
# => false

# x[1] は #[] メソッドに引数 1 を渡しているので
# .[] 1 のように呼び出すことが出来る
p "homu".[] 1
# => 2

なので、これらの演算子はメソッドとして定義して使用することができます。

class X
    def initialize n
        @value = n
    end

    # + 演算子を定義
    # 右辺値を引数に受け取る
    def + other
        @value + other
    end

    # == 演算子を定義
    def == other
        @value == other
    end
end

x = X.new 42

p x + 35
# => 77

p x == 42
# => true

ポイントしては『左辺値は必ずレシーバ(自身)になる』ところですかねえ。
なので『右辺値のオブジェクトに対して演算子を定義する』みたいなことは難しいです。

単項演算子 -! なんかを定義する

-obj!obj みたいな単項演算子Ruby で再定義する場合は @+ のように定義します。

class String
    # 演算子 + @ 名でメソッドを定義する
    def -@
        to_i.-@.to_s
    end

    def !@
        empty?
    end
end

p -"1234"

# メソッド呼び出しの場合は @ を付ける
p "42".-@

p !"homu"
# => false
p !""
# => false

こんな感じで単項演算子を定義する場合は @ を付けて定義します。

再定義出来る演算子一覧

Ruby では以下の演算子を再定義することができます。

|  ^  &  <=>  ==  ===  =~  >   >=  <   <=   <<  >>
+  -  *  /    %   **   ~   +@  -@  []  []=  ` ! != !~

&&|| なんかは再定義できないことに注意してください。

まとめ

  • Ruby では殆どの演算子はメソッドとして定義されている
  • 左辺値はレシーバを指す
  • 単項演算子@! のようにして定義する


演算子の使用は用法用量を守って正しくお使いください。