Вы можете открыть собственный класс из метода и установить там атрибут:
class SomeClass
def initialize(arg)
(class << self; self; end).send(:attr_reader, :hello)
@hello = arg
end
end
Таким образом, собственный класс каждого экземпляра будет иметь это средство чтения атрибутов. Но на самом деле имеет смысл действовать таким образом, только если имя атрибута динамическое и может варьироваться от экземпляра к экземпляру. Если это всегда hello
, я не вижу никаких недостатков, если просто определить его в классе, как ваш оригинальный блок кода.
Например, если вы динамически передаете имя атрибута, вы можете сделать это следующим образом:
class SomeClass
def initialize(attr, arg)
(class << self; self; end).send(:attr_reader, attr.to_sym)
instance_variable_set("@#{attr}", arg)
end
end
Это совместимо с Ruby 1.8. Взяв подсказку от @HenrikN в комментарии к вашему вопросу, вы можете использовать define_singleton_method
в Ruby 1.9:
class SomeClass
def initialize(attr, arg)
define_singleton_method(attr) { instance_variable_get("@#{attr}") }
instance_variable_set("@#{attr}", arg)
end
end