Ruby
FizzBuzz

FizzBuzzクイズの実装例( ruby )

問題と実装例:https://qiita.com/sumim/items/f26902f2b813c075a619

私の実装:

[[3, :fizz], [5,:buzz]].each do |base, name|
  Numeric.class_eval do
    define_method name do
      one = self % base==0
      if one
        r=name.to_s.capitalize
        eval(%Q!def r.val; #{self}; end!)
        r
      else
        self
      end
    end
  end
  String.class_eval do
    define_method name do
      self << name.to_s.capitalize if self.val % base==0
      self
    end
  end
end

解けてはいるものの、eval を使ったので負けっぽい。

この eval を避ける方法がわからなかった。

上記リンクの実装例を見て、なるほどと思うなど。

しかし、ruby 以外で実装できる言語は何があるだろう。python は有望かもしれないけど、python のマジカルな部分はよく知らないので私にはわからない。

で。
https://qiita.com/hadzimme/items/7f8d1c2458bcd2180d26
を拝見してなるほどと思い、 eval を使っていないバージョンを書いておく:

[[3, :fizz], [5,:buzz]].each do |base, name|
  Numeric.class_eval do
    define_method name do
      if self % base==0
        name.to_s.capitalize.tap{ |x|
          this=self; # ここで this に受けるのがなんか悔しい
          x.define_singleton_method( :val ){ this }
        }
      else
        self
      end
    end
  end
  String.class_eval do
    define_method name do
      self.tap{ |this| this  << name.to_s.capitalize if self.val % base==0 }
    end
  end
end

要するに、私は define_singleton_method を見つけられなかったということ。
ぐぬぬ。