2009-05-16 2 views
1

Допустим, ваш коллега monkeypatches класса Fixnum и переопределяет метод + вычитать вместо оного:Как вы можете повлиять на последовательность загрузки Ruby-кода?

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 

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

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

Есть две причины для моего вопроса:

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

О, боже, просто глядя на эту палочку обезьяны, я съеживаюсь. –

+0

@ Ólafur - Я согласен. Несмотря на мощь, которую он дает, monkeypatching действительно открывает возможность для многих катастрофических побочных эффектов. Вы должны спросить, действительно ли это стоит того. –

ответ

6

Несомненно. Просто вставьте анти-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

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

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

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

+0

Не знаком с этим. Это метод Rails? (Я только занимаюсь Ruby здесь.) –

+0

alias_method_chain кажется синонимом alias_method (из того, что я могу сказать). Итак, в этом смысле, да, я согласен с вами, он должен был оставить метод + в одиночку и вместо этого наследовать его как coworker_plus. Таким образом, я мог получить доступ к оригиналу. Но мы не всегда контролируем то, что делают наши коллеги, не так ли? Иногда они оказываются более политически влиятельными и властными, скажем, (например). –