Мой первоначальный ответ был совершенно неверным, как указывал @Matthew. Но есть и другие обходные пути. Например, вы можете назначить анонимный класс переменной класса в Control
и по-прежнему определять методы как обычно, используя class_eval
:
module MyLib
class Control
def initialize
end
def do_stuff
@@helper.new('things')
end
@@helper = Class.new
@@helper.class_eval do
def initialize(what)
@what = what
end
def shout
@what
end
end
end
end
Фрагмент
c = MyLib::Control.new
h = c.do_stuff
p h.shout
все еще пишет "things"
, но теперь нет доступа к @@helper
, кроме как через переменную класса. Если кто-то действительно хочет получить к нему доступ, то после того, как я снова открою класс Control
или воспользуюсь class_eval
, ничто не остановит его, но с динамическим языком вам придется иметь дело с этим.
Я решил присвоить анонимный класс переменной класса, чтобы он создавался только один раз; но если вам не нужно переопределять анонимный класс много раз, нет причины, по которой он не может быть переменной экземпляра.