Здесь есть одна проблема с этими двумя методами ... если переменная экземпляра установлена в одном экземпляре, ее метод доступа будет доступен для всех экземпляров, потому что вы определяете методы для self.class
вместо для себя.
dude = Mine.new
dude.my_number 1
puts dude.my_1
dudette = Mine.new
dudette.my_1 = 2 # works, but probably shouldn't
dudette.my_number 2
dude.my_2 = 3 # works, but probably shouldn't
Что вы, вероятно, хотите сделать, это изменить только тот экземпляр, который имеет переменную экземпляра:
class Mine
# ...
def my_number num
class << self
attr_accessor "my_#{num}"
end
self.send("my_#{num}=", num)
end
end
Таким образом, переменные экземпляра получают средства доступа только для тех объектов, для которых они были созданы. Я также не стал беспокоиться об экземпляре instance_variable_set, потому что, если вы устанавливаете аксессор, то я думаю, что это лучше читать, если использовать его повторно. Но это вызов стиля. Главное здесь - звонить class << self
вместо self.class
.