Не делай этого!
Попытка создать идентификаторы, которые недопустимы на вашем языке, не является хорошей идеей. Если вы действительно хотите установить такие переменные, используйте макросы атрибутов:
attr_writer :bar
attr_reader :baz
attr_accessor :foo
Хорошо, теперь, когда вас предупредили, вот как это сделать. Просто возвращайте другой экземпляр того же класса каждый раз, когда вы получаете обычный метод доступа, и по мере необходимости собирайте необходимую информацию.
class SillySetter
def initialize path=nil
@path = path
end
def method_missing name,value=nil
new_path = @path ? "#{@path}.#{name}" : name
if name.to_s[-1] == ?=
puts "setting #{new_path} #{value}"
else
return self.class.new(path=new_path)
end
end
end
s = SillySetter.new
s.foo = 5 # -> setting foo= 5
s.foo.bar.baz = 4 # -> setting foo.bar.baz= 4
Я не хотел поощрять рубиновую глупость, но я просто не мог с собой поделать!