問題と実装例: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 を見つけられなかったということ。
ぐぬぬ。