Комментарии 7
похоже, блог пора переименовывать из Ruby в «Мышевозы» или как-нибудь еще.
-1
Заминусовали скорее за то что хабр не форум
А по коду… что не позволило сделать так?
class B < A
def save(validate = false)
super(validate)
end
end
А по коду… что не позволило сделать так?
class B < A
def save(validate = false)
super(validate)
end
end
0
если коротко, то сейв в классе В не вызывается прямо, плюс внутри сохраняются несколько объектов (это уже в ответ на следующий вариант —
В общем, если никому не интересно — так и скажите, закрою в приват, буду сам любоваться.
Copy Source | Copy HTML
- class B
- def initialize
- @a=A.new
- @a.instance_eval <<-EOF
- alias :old_save :save
- def save(validate = false)
- old_save(validate)
- end
- EOF
- end
В общем, если никому не интересно — так и скажите, закрою в приват, буду сам любоваться.
-1
Совсем не понятна суть задачи,
почему нельзя просто переопределить метод?
Зачем метапрограммирование?
почему нельзя просто переопределить метод?
Зачем метапрограммирование?
не интересно— я бы сказал не понятно, то ли вопрос, то ли подход, то ли ещё что то.
0
да, согласен, хотя казалось, что объяснил достаточно хорошо :)
Класс В имеет метод (можно назвать его лучше build), создающий объекты (один или несколько, зависит от других условий и решается по ходу работы программы). Сам объект класса В объекты других классов не инстанциирует, их конструкторы вызываются снаружи.
Класс В уже написан и функционирует, нужно или поменять все вызовы save на save(false) (что в принципе проще), или вывернуться вот таким образом, переопределив поведение метода, если он вызывается изнутри определенного контекста (что ГОРАЗДО сложнее и даже скорее всего неправильно, потому что другие программисты не подозревают о такой подставе, и реально стало интересно с точки зрения возможностей руби).
Таким образом, интерфейс класса В и параметры вызова save менять нельзя :)
Соображу утром более адекватный пример кода — допишу сюда.
Класс В имеет метод (можно назвать его лучше build), создающий объекты (один или несколько, зависит от других условий и решается по ходу работы программы). Сам объект класса В объекты других классов не инстанциирует, их конструкторы вызываются снаружи.
Класс В уже написан и функционирует, нужно или поменять все вызовы save на save(false) (что в принципе проще), или вывернуться вот таким образом, переопределив поведение метода, если он вызывается изнутри определенного контекста (что ГОРАЗДО сложнее и даже скорее всего неправильно, потому что другие программисты не подозревают о такой подставе, и реально стало интересно с точки зрения возможностей руби).
Таким образом, интерфейс класса В и параметры вызова save менять нельзя :)
Соображу утром более адекватный пример кода — допишу сюда.
0
а рубисты вообще странный народ)
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Изменение поведения метода в зависимости от контекста