Daniel Berger wrote: > Hi all, > > Another question about Rational#power!. I tried this > > irb(main):001:0> 2.power!(-2) > NoMethodError: undefined method `power!' for 2:Fixnum > from (irb):1 > irb(main):002:0> require 'rational' > => true > irb(main):003:0> 2.power!(-2) > => 0.25 # huh? > > That returns 0.25. However, I would have expected Rational(1, 4). Based on > the code in rational, it looks like power! is an alias for **, and ** is an > alias for rpower. So, based on the rpower method, I would think that a > negative value for +other+ would call Rational.new! and return a Rational. > > Or do I have it wrong? > > from rational.rb: > > class Fixnum > undef quo > # If Rational is defined, returns a Rational number instead of a Fixnum. > def quo(other) > Rational.new!(self,1) / other > end > alias rdiv quo > > # Returns a Rational number if the result is in fact rational (i.e. +other+ > < 0). > def rpower (other) > if other >= 0 > self.power!(other) > else > Rational.new!(self,1)**other > end > end > > unless defined? 1.power! > alias power! ** > alias ** rpower > end > end > > Ideas? Thanks. > > Dan power! is an alias of Fixnum::**, then ** is reused as an alias of rpower So calling power! is not invoking rpower, it is invoking the original Fixnum:** Took me a while to figure that out, the alias'ing does at first glance look like it would chain the methods as you expected Cheers