【一人 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
こんな感じで単項演算子を定義する場合は @
を付けて定義します。
再定義出来る演算子一覧
| ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` ! != !~
&&
や ||
なんかは再定義できないことに注意してください。
まとめ
演算子の使用は用法用量を守って正しくお使いください。