Pull to refresh

Comments 7

похоже, блог пора переименовывать из Ruby в «Мышевозы» или как-нибудь еще.
судя по минусам в рейтинге статьи
Заминусовали скорее за то что хабр не форум
А по коду… что не позволило сделать так?

class B < A
def save(validate = false)
super(validate)
end
end
если коротко, то сейв в классе В не вызывается прямо, плюс внутри сохраняются несколько объектов (это уже в ответ на следующий вариант —
Copy Source | Copy HTML
  1. class B
  2.   def initialize
  3.     @a=A.new
  4.     @a.instance_eval <<-EOF
  5.       alias :old_save :save
  6.       def save(validate = false)
  7.         old_save(validate)
  8.       end
  9.     EOF
  10.   end


В общем, если никому не интересно — так и скажите, закрою в приват, буду сам любоваться.
Совсем не понятна суть задачи,
почему нельзя просто переопределить метод?
Зачем метапрограммирование?
не интересно
— я бы сказал не понятно, то ли вопрос, то ли подход, то ли ещё что то.
да, согласен, хотя казалось, что объяснил достаточно хорошо :)
Класс В имеет метод (можно назвать его лучше build), создающий объекты (один или несколько, зависит от других условий и решается по ходу работы программы). Сам объект класса В объекты других классов не инстанциирует, их конструкторы вызываются снаружи.
Класс В уже написан и функционирует, нужно или поменять все вызовы save на save(false) (что в принципе проще), или вывернуться вот таким образом, переопределив поведение метода, если он вызывается изнутри определенного контекста (что ГОРАЗДО сложнее и даже скорее всего неправильно, потому что другие программисты не подозревают о такой подставе, и реально стало интересно с точки зрения возможностей руби).

Таким образом, интерфейс класса В и параметры вызова save менять нельзя :)

Соображу утром более адекватный пример кода — допишу сюда.
а рубисты вообще странный народ)
Sign up to leave a comment.

Articles