Проблема с вашим решением method_missing
состоит в том, что он будет перенаправлять вызовы на instance
, только если в SingletonKlass
не существует метода с таким именем, что вызовет проблемы, если люди захотят получить доступ, например, instance.__id__
через этот интерфейс вы предоставляете. Существует не так много проблем с доступом к SingletonKlass.instance
обычным способом, но если вы действительно хотите сделать ярлык, самый безопасный будет константа:
KlassInstance = SingletonKlass.instance
Если вы хотите определить константу динамически, используйте Module#const_set
:
const_set :KlassInstance, SingletonKlass.instance
Вы также можете расширить это. Например, вы можете создать метод, который будет создавать для вас такие константы:
def singleton_constant(singleton_class)
const_set singleton_class.name, singleton_class.instance
end
Конечно, поскольку Module#const_set
является методом модуля, этот конкретный метод может быть выполнен только в контексте модуля или класса. Другой возможностью является использование модуля mixin с перегруженным методом ловушек:
module SingletonInstance
def included(base_class)
const_set base_class.name, base_class.instance
super
end
end