2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FizzBuzzクイズの実装例( ruby )

Last updated at Posted at 2017-09-24

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

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?