Как вы можете повлиять на последовательность загрузки кода Ruby?
-
22-08-2019 - |
Вопрос
Допустим, ваш коллега исправляет класс Fixnum и переопределяет метод + для вычитания вместо сложения:
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
Но что мне нужно знать, так это:
Есть ли другой способ загрузить этот псевдоним ДО того, как загрузится его обезьяний патч, кроме вставки его в тот же исходный файл, который он изменил?
У моего вопроса две причины:
- Возможно, я не хочу, чтобы он знал, что я это сделал.
- Если исходный файл изменен так, что псевдоним окажется НИЖЕ обезьяньего патча, то псевдоним больше не будет давать желаемый результат.
Решение
Конечно.Просто вставьте 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
Другие советы
Monkeypatching позволяет расширить существующий класс и добавить новые функции.Внесение патчей для изменения поведения существующих функций — это просто безумие!
Серьезно, вам следует поговорить со своим коллегой.
Если, как в вашем примере, он переопределил существующий метод только для того, чтобы изменить его поведение, вам следует поговорить с ним и посоветовать ему использовать alias_method_chain
чтобы сохранить существующее поведение.