Найти все интервалы, перекрывающиеся с заданным числом

Рациональные числа нормализуются при инициализации, поэтому вы не можете узнать, какие числа указаны в качестве исходных аргументов. Вы также не можете подклассы 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
0
задан Patrick 16 January 2019 в 22:44
поделиться