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

StackOverflow https://stackoverflow.com/questions/872663

  •  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

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

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

У моего вопроса две причины:

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

Решение

Конечно.Просто вставьте 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 чтобы сохранить существующее поведение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top