Fixed wrong overloading.

`float op rational` should return `float`, since float is an inexact
value.
This commit is contained in:
Yukihiro "Matz" Matsumoto
2019-05-17 16:18:46 +09:00
parent 237a57bbe8
commit 912d23634d
+19 -11
View File
@@ -106,18 +106,26 @@ def Rational(numerator = 0, denominator = 1)
Rational.new(numerator, denominator)
end
[Fixnum, Float].each do |cls|
[:+, :-, :*, :/, :<=>, :==, :<, :<=, :>, :>=].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)
else
__send__(original_operator_name, rhs)
end
[:+, :-, :*, :/, :<=>, :==, :<, :<=, :>, :>=].each do |op|
Fixnum.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)
else
__send__(original_operator_name, rhs)
end
end
end
Float.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
rhs = rhs.to_f
end
__send__(original_operator_name, rhs)
end
end
end