diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-05-16 22:09:56 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-05-16 22:09:56 +0900 |
| commit | f5fb1307b017fb972c12b4ec4b1866d789b0ca09 (patch) | |
| tree | 944be2d50b5d40da236cd81d3793bad4884c4aca /mrbgems/mruby-rational/mrblib | |
| parent | 9b604abc8300d378bb32fb0e88d6f0831ed7e0d9 (diff) | |
| download | mruby-f5fb1307b017fb972c12b4ec4b1866d789b0ca09.tar.gz mruby-f5fb1307b017fb972c12b4ec4b1866d789b0ca09.zip | |
Fix `Rational#==`
Diffstat (limited to 'mrbgems/mruby-rational/mrblib')
| -rw-r--r-- | mrbgems/mruby-rational/mrblib/rational.rb | 29 |
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 |
