blob: 457c0488a6fdf9603e1ea8157ef4a4771b02a781 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
class Rational < Numeric
def initialize(numerator = 0, denominator = 1)
@numerator = numerator
@denominator = denominator
end
attr_reader :numerator, :denominator
end
def Rational(numerator = 0, denominator = 1)
Rational.new(numerator, denominator)
end
module ForwardOperatorToRational
def __forward_operator_to_rational(op, &b)
original_operator_name = "__original_operator_#{op}_rational"
alias_method original_operator_name, op
define_method op do |rhs|
if rhs.is_a? Rational
Rational.new(self).send(op, rhs)
else
send(original_operator_name, rhs)
end
end
end
def __forward_operators_to_rational
__forward_operator_to_rational :+
__forward_operator_to_rational :-
__forward_operator_to_rational :*
__forward_operator_to_rational :/
singleton_class.undef_method :__forward_operator_to_rational
singleton_class.undef_method :__forward_operators_to_rational
end
end
class Fixnum
extend ForwardOperatorToRational
__forward_operators_to_rational
end
class Float
extend ForwardOperatorToRational
__forward_operators_to_rational
end
|