Integer#gcdlcmの実装が気に入らない
昨日に引き続きIntegerに関して。
個人的に、Integerブームが起こってます。
Integerに関しては、http://www.ruby-doc.orgのClass: Integerを参照のこと。
今日は最大公約数と最小公倍数を同時に返してくれるInteger#gcdlcmについてです。
このInteger#gcdlcmの実装が気に入らない!!
どこが気に入らないのかという本題に入る前に、Integer#lcmについての実装を見てみよう!
ruby>>
File lib/rational.rb, line 457
def lcm(other)
if self.zero? or other.zero?
0
else
(self.div(self.gcd(other)) * other).abs
end
end
<<ruby
オーソドックスなの最小公倍数の求め方。
ここではあまり問題にしない。
このコードをよーく覚えておいてください。
ここからが本題です。
Integer#gcdlcmの実装を見て見る。
ruby>>
File lib/rational.rb, line 473
def gcdlcm(other)
gcd = self.gcd(other)
if self.zero? or other.zero?
[gcd, 0]
else
[gcd, (self.div(gcd) * other).abs]
end
end
<<ruby
Integer#lcmにそっくり!
・・・って、Integer#lcmのコードにInteger#gcdいれただけじゃないですか・・・。
せっかくこのコードの直前で、Integer#lcmを定義してるのに、何で使わないんやろうか・・・。
ruby>>
def gcdlcm(other)
return [self.gcd(other), self.lcm(other)]
end
<<ruby
という風に書いても不都合はなさそうやけど・・?
むしろ、こういう風に書いてくれたほうが、気持ちいいんやけども。
ん~、Integerには謎がいっぱいや。