演算子メソッド
以下のような演算子は他の言語でも同じような結果になると思います。
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"
参考