Как вы можете повлиять на последовательность загрузки кода на Ruby? - PullRequest
1 голос
/ 16 мая 2009

Допустим, ваш коллега обезьяна выбрал класс Fixnum и переопределил метод + для вычитания вместо add:

class Fixnum
  def +(x)
    self - x
  end
end

>> 5 + 3
=> 2

Ваша проблема в том, что вы хотите получить доступ к оригинальной функциональности метода +. Таким образом, вы помещаете этот код в тот же исходный файл. Он псевдоним метода + к «original_plus» , прежде чем он обезьяны патч.

class Fixnum
  alias_method :original_plus, :+
end

class Fixnum
  def +(x)
    self - x
  end
end

Теперь вы можете получить доступ к оригинальной функциональности метода + через original_plus

>> 5 + 3
=> 2
>> 5.original_plus(3)
=> 8

Но что мне нужно знать, это:

Есть ли другой способ загрузки этого псевдонима ДО его загрузки monkeypatch, кроме того, чтобы вставить его в тот же исходный файл, который он изменил?

На мой вопрос есть две причины:

  1. Возможно, я не хочу, чтобы он знал, что я сделал это
  2. Если исходный файл изменен таким образом, что псевдоним заканчивается НИЖЕ мартышкой, тогда псевдоним больше не будет давать желаемый результат.

Ответы [ 2 ]

6 голосов
/ 16 мая 2009

Конечно. Просто вставьте anti-monkeypatch в ваш код до , вам потребуется его исходный файл.

 % cat monkeypatch.rb
 class Fixnum
   def +(x)
     self - x
   end
 end
 % cat mycode.rb
 class Fixnum
   alias_method :original_plus, :+
 end
 require 'monkeypatch'
 puts 5 + 3 #=> 2
 puts 5.original_plus(3) #=> 8
2 голосов
/ 16 мая 2009

Monkeypatching приятно расширять существующий класс и добавлять новые функции. Monkeypatching для изменения поведения существующих функций просто сумасшедший!

Серьезно, тебе следует поговорить со своим коллегой.

Если, как в вашем примере, он переопределил существующий метод только для того, чтобы изменить его поведение, вам следует поговорить с ним и посоветовать ему использовать alias_method_chain для сохранения существующего поведения.

...