問題
答案
先行の解答を見ずに書いたら、以下の記事の解答とほぼ同じになりました。
比較してみて面白かったので、変数名を参考にさせていただき、推敲しました。
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
かなということでちょっと修正