Рациональные числа нормализуются при инициализации, поэтому вы не можете узнать, какие числа указаны в качестве исходных аргументов. Вы также не можете подклассы Rational
устанавливать собственный инициализатор, а monkeypatching, как и вы, на самом деле не является оптимальным способом достижения того, чего вы хотите достичь (что, я думаю, вы знаете).
Что вы можете сделать, это создать прокси-сервер вокруг Rational
с BasicObject
, который сохранит исходные аргументы и не нарушит нормальную работу исходного Rational
класса
class RationalWithArgumentStore < BasicObject
attr_accessor :original_arguments, :rational
def initialize *args
@original_arguments = args
@rational = Rational *args
end
# Basic Object is a basic object, but defines ==
# so let's overwrite it to route to rational
def == other
@rational == other
end
# Route all unknown method calls to rational
def method_missing meth, *args, &block
@rational.send meth, *args, &block
end
end
def RationalWithArgumentStore(*args)
RationalWithArgumentStore.new(*args)
end
Теперь вы можете сделать
my_rational = RationalWithArgumentStore(2,10)
my_rational.original_arguments #=> [2, 10]
#use it like a normal rational
my_rational * 3
my_rational.truncate