summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-rational/mrblib/rational.rb
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2019-05-16 22:09:56 +0900
committerKOBAYASHI Shuji <[email protected]>2019-05-16 22:09:56 +0900
commitf5fb1307b017fb972c12b4ec4b1866d789b0ca09 (patch)
tree944be2d50b5d40da236cd81d3793bad4884c4aca /mrbgems/mruby-rational/mrblib/rational.rb
parent9b604abc8300d378bb32fb0e88d6f0831ed7e0d9 (diff)
downloadmruby-f5fb1307b017fb972c12b4ec4b1866d789b0ca09.tar.gz
mruby-f5fb1307b017fb972c12b4ec4b1866d789b0ca09.zip
Fix `Rational#==`
Diffstat (limited to 'mrbgems/mruby-rational/mrblib/rational.rb')
-rw-r--r--mrbgems/mruby-rational/mrblib/rational.rb29
1 files changed, 25 insertions, 4 deletions
diff --git a/mrbgems/mruby-rational/mrblib/rational.rb b/mrbgems/mruby-rational/mrblib/rational.rb
index 7d5b87362..dbc855af0 100644
--- a/mrbgems/mruby-rational/mrblib/rational.rb
+++ b/mrbgems/mruby-rational/mrblib/rational.rb
@@ -1,4 +1,7 @@
class Rational < Numeric
+ # Override #<, #<=, #>, #>= in Numeric
+ prepend Comparable
+
def initialize(numerator = 0, denominator = 1)
@numerator = numerator
@denominator = denominator
@@ -66,6 +69,24 @@ class Rational < Numeric
end
end
+ def <=>(rhs)
+ case rhs
+ when Fixnum
+ return @numerator <=> rhs if @denominator == 1
+ rhs = Rational(rhs)
+ when Float
+ return to_f <=> rhs
+ end
+ case rhs
+ when Rational
+ (@numerator * rhs.denominator - @denominator * rhs.numerator) <=> 0
+ when Numeric
+ return rhs <=> self
+ else
+ nil
+ end
+ end
+
def negative?
numerator.negative?
end
@@ -86,17 +107,17 @@ def Rational(numerator = 0, denominator = 1)
end
[Fixnum, Float].each do |cls|
- [:+, :-, :*, :/, :==].each do |op|
+ [:+, :-, :*, :/, :<=>, :==, :<, :<=, :>, :>=].each do |op|
cls.instance_exec do
original_operator_name = "__original_operator_#{op}_rational"
alias_method original_operator_name, op
define_method op do |rhs|
if rhs.is_a? Rational
- Rational(self).send(op, rhs)
+ Rational(self).__send__(op, rhs)
else
- send(original_operator_name, rhs)
+ __send__(original_operator_name, rhs)
end
end
end
end
-end \ No newline at end of file
+end