Есть ли лучший способ "обезьяна-патч" базовых классов Руби? - PullRequest
2 голосов
/ 17 января 2011

Для библиотеки геометрии, которую я пишу, я хочу поддерживать умножение векторов на скаляры, что достаточно просто сделать для vector * scalar, просто определив метод Vector#*.Однако для поддержки scalar * vector все методы Fixnum#*, Bignum#* и Float#* должны быть заштрихованы.Я использую следующий код для каждого из этих классов, чтобы выполнить это:

class Fixnum
  old_times = instance_method(:'*')

  define_method(:'*') do |other|
    case other
    when Geom3d::Vector
      Geom3d::Vector.new(self * other.dx, self * other.dy, self * other.dz)
    else
      old_times.bind(self).(other)
    end
  end
end

class Bignum
  #...
end

class Float
  #...
end

Мне интересно, есть ли лучший способ сделать это, или есть потенциальные проблемы с этим?

Ответы [ 2 ]

1 голос
/ 17 января 2011

Вы хотите # принуждение

что-то вроде

class Geom3d::Vector
    def coerce(right_hand_side)
       self,right_hand_side
    end
end

http://corelib.rubyonrails.org/classes/Vector.html

1 голос
/ 17 января 2011

Взгляните на рубиновую принудительную функцию .

...