Ваше первое желание - использовать class_eval
на p
, например:
p.class_eval {
...
}
Увы, это не сработает, потому что class_eval
- это метод, определенный на Module
, а не на Object
. Поскольку p
является экземпляром объекта, а не Module
или Class
, у него нет метода class_eval
.
Хитрость заключается в том, чтобы сначала получить синглтон-класс p
, а затем запустить на нем class_eval
. Поскольку этот равен a Class
(и, соответственно, Module
), он имеет метод class_eval
. Если вы используете 1.9.2 или более позднюю версию, вы можете использовать метод singleton_class
:
p.singleton_class.class_eval {
...
}
В противном случае вы можете просто получить синглтон-класс напрямую:
(class << p; self; end).class_eval {
...
}
<Ч />
Как указывает Йорг, вы также можете использовать define_singleton_method
:
p.define_singleton_method :validate { |opts|
v.call(self, opts)
}
Но учтите, что если вы сделаете это, результирующий метод validate
будет иметь значение private
, что может оказаться не тем, что вы хотите.