プログラミング学習メモ

RubyとRuby on Rails等

演算子メソッド

以下のような演算子は他の言語でも同じような結果になると思います。

10 + 10 #=> 20
10 * 2  #=> 20

ではこれはどうでしょうか

'dog' + 'cat' #=> "dogcat"
'dog' * 3     #=> "dogdogdog"

上記のように同じ演算子なのに振る舞いが異なるのは、それぞれの演算子Integerクラス・Stringクラスのインスタンスメソッドのためです。 再定義が可能な演算子全てがメソッドで実装されています。

上記の構文は以下のようなメソッドのシンタックスシュガー(同じ動きでわかりやすい構文)です。

#違いをわかりやすくするために()を用いています
10.+(10)         #=> 20
10.*(2)          #=> 20
'dog'.+('cat')   #=> "dogcat"
'dog'.*(3)       #=> "dogdogdog"

演算子メソッドを再定義は以下のようにします。

#二項演算子
def 演算子(引数) #オブジェクト + 引数(+なら)
  #処理
end
#単項演算子
def 演算子@ #+オブジェクト(+なら)
  #処理
end

Rubyオープンクラスなので、組み込みのライブラリにメソッドの追加や変更が簡単に行えます。
既存のクラスを再定義するだけで、同名の部分は変更し、そうでない部分は追加されます。

#Stringクラスに-メソッドは存在しません

class String
  def -(string)
    unless string.class == String
      return self
    end
    self.gsub(string, '')
  end
end

#完全一致した文字列を取り除く
'string' - 'ring' #=>"st"

参考

Rubyリファレンス(演算子メソッドの定義)
Rubyリファレンス(演算子式)