3
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.

Re: 「FizzBuzzクイズ」クイズ-Ruby編

Last updated at Posted at 2017-09-27

問題

「FizzBuzzクイズ」クイズ-Ruby編

答案

先行の解答を見ずに書いたら、以下の記事の解答とほぼ同じになりました。

FizzBuzzクイズの実装例( ruby )

比較してみて面白かったので、変数名を参考にさせていただき、推敲しました。

fizz_buzz_quiz.rb
module FizzBuzzQuiz
  class << self
    def included(mod)
      module_name = mod.name
      base = mod.const_get(:BASE)

      Integer.class_eval do
        define_method(module_name.downcase) do
          return self unless self % base == 0
          s = module_name
          i = self
          s.define_singleton_method(:to_fizz_buzz_i){ i }
          s
        end
      end

      String.class_eval do
        define_method(module_name.downcase) do
          return self unless self.to_fizz_buzz_i % base == 0
          s = self + module_name
          i = self.to_fizz_buzz_i
          s.define_singleton_method(:to_fizz_buzz_i){ i }
          s
        end
      end
    end
  end
end
fizz.rb
require "./fizz_buzz_quiz"

module Fizz
  BASE = 3
  include FizzBuzzQuiz
end
buzz.rb
require "./fizz_buzz_quiz"

module Buzz
  BASE = 5
  include FizzBuzzQuiz
end
pezz.rb
require "./fizz_buzz_quiz"

module Pezz
  BASE = 7
  include FizzBuzzQuiz
end
main.rb
require "./fizz"
require "./buzz"

p 1.fizz.buzz #=> 1
p 3.fizz.buzz #=> "Fizz"
p 5.fizz.buzz #=> "Buzz"
p 15.fizz.buzz #=> "FizzBuzz"
p 15.buzz.fizz #=> "BuzzFizz"
p 7.fizz.buzz #=> 7

require "./pezz"

p 7.fizz.buzz.pezz #=> "Pezz"
p 21.fizz.buzz.pezz #=> "FizzPezz"
p 35.fizz.buzz.pezz #=> "BuzzPezz"
p 105.fizz.buzz.pezz #=> "FizzBuzzPezz"
p 105.fizz.pezz.buzz #=> "FizzPezzBuzz"
p 105.pezz.buzz.fizz #=> "PezzBuzzFizz"

p 1.fizz.buzz.pezz #=> 1
p 3.fizz.buzz.pezz #=> "Fizz"
p 5.fizz.buzz.pezz #=> "Buzz"
p 15.fizz.buzz.pezz #=> "FizzBuzz"
p 15.buzz.fizz.pezz #=> "BuzzFizz"
p 104.fizz.buzz.pezz #=> 104

追加実装の際は、新しくモジュールを書き、それをrequireします。このためだけにわざわざモジュール使う必要あんのかという感じですが、既存コードに対して必要な変更という意味ではプラス1行だし、なんとなく波風立たなそうなので、これでいいということにします。

Rubyを久しぶりに書きましたが、こういうのはとても楽しいですね。

追記

  • 先にreturnするならselfかなということでちょっと修正
3
0
2

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
3
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?