TakayukiKoyama Geek Blog

Create, Entertain, Experience

メタプロ Ruby 第2版 5.7クイズを考える

クイズ概要

 1+11.+(1)シンタックスシュガーであるが、その結果を常に プラス1 されるように +演算子を破壊しろという問題。 答えはアラウンドエイリアスを使った方法であるが、今回はPrependラッパーでどうにかできないかと思考した話。 要するに以下のようになれば良い。

p 1 + 1 # => 3
p 1 + 2 # => 4
p 2 + 2 # => 5

 詳細と答えのプログラムは本を買ってくださいということで。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

思考した結果

 Floatに逃げただけだった。やっぱりプラス1するには再定義する前の + 演算子を使うしかないので、きれいに prepend するのは無理なのだろうか...

module ExplicitFixnum
  def + value
    super(value.to_f + 1.0).to_i
  end
end

Fixnum.class_eval do
  prepend ExplicitFixnum
end