はなちin

Okinawarb

先週のOkinawa.rbについて記事を書きます。 気づけば1週間たち、今週のOkinawa.rbの前日になりました。

単項演算子のオーバーライド

@naopontanさんがQiitaのGoogleのプログレスバー作ってみたの記事中のコードについて疑問があったらしい。 具体的には+@メソッドのオーバーライドの部分。 つい前日に僕もExtending Ruby with Rubyの中で、+@メソッドについて調べていたので、理解を深めるためにコードをいくつか書いた。

単項演算子とは?

a + bのようにaとb、2つの項を取る演算子を二項演算子という。 単項演算子は-a+aのように、1つの項を取る演算子のことをいう。

a + bは実はaのインスタンスメソッド+の呼び出しなので、a.+(b)こうい風に書くこともできる。 インスタンスメソッドなので、オーバーライドすることも出来る。

二項演算子の+をオーバーライドするときはdef +; endと書く。 単項演算子の+をオーバーライドするためにはdef +@; endと書く。 詳しくはクラス/メソッドの定義、演算子式の定義を見ましょう。

試したコード

1
2
3
4
5
6
7
8
9
class Fixnum
  def +@
    '+@ override!'
  end
end

# +3はリテラルの3と認識されるため単項演算子の+は呼び出されない。
puts +3 # => 3
puts +(3) # => +@ override!

まとめ

しかし1週間もたつと忘れてしまいますね。 他にはTitanium Studioの話をしたり、KLabのプロトタイピングラボの話を教えていただきました。 今後は毎週記事を書こうと思います。

Comments