Если у меня есть класс с attr_accessor
, он по умолчанию создает переменную экземпляра вместе с соответствующими геттерами и сеттерами. Но вместо того, чтобы создавать переменную экземпляра, есть ли способ заставить его создать переменную класса или переменную экземпляра класса?Как attr_accessor Ruby может создавать переменные класса или переменные экземпляра класса вместо переменных экземпляра?
ответ
Как это:
class TYourClass
class << self
attr_accessor :class_instance_variable
end
end
Вы можете смотреть на это как открытие метакласса класса (из которых сам класс является экземпляром) и добавление к нему атрибут.
attr_accessor
- метод класса Class
, он добавляет к классу два метода: тот, который считывает переменную экземпляра, и другую, которая ее устанавливает. Вот возможная реализация:
class Class
def my_attr_accessor(name)
define_method name do
instance_variable_get "@#{name}"
end
define_method "#{name}=" do |new_val|
instance_variable_set "@#{name}", new_val
end
end
end
Полностью тестировался атрибут класса сбруя:
class Class
def class_attr_accessor(name)
define_method name do
class_variable_get "@@#{name}"
end
define_method "#{name}=" do |new_val|
class_variable_set "@@#{name}", new_val
end
end
end
Спасибо. Мне нравится ваш способ сказать, что он открывает метакласс класса, а также добавляет добавление. Но почему он создает переменную экземпляра класса вместо переменной класса? И возможно ли получить его для создания переменной класса, или этот синтаксис будет работать только для переменных экземпляра класса? –
Я другой, см. Ответ снова –
Это будет работать только для переменных экземпляра класса, b/c attr_ * определяет методы для переменных экземпляра (некоторого объекта). – rampion
В Rails (или где вы require 'active_support'
), вы можете использовать cattr_accessor :name
, чтобы получить переменные аксессор истинного класса.
Переменные экземпляра класса, которые другие указали, обычно более полезны. У APIdock cattr_accessor
page есть полезная дискуссия, поясняющая, когда вы захотите, а не другой, плюс источник для функций cattr_accessor
, cattr_reader
и cattr_writer
.
намного проще - не знал, что рельсы предложили это. Благодаря! –
- 1. Переменные класса против переменных экземпляра уровня класса
- 2. Переменные экземпляра класса в Ruby
- 3. переменные экземпляра класса python и переменные класса
- 4. Переменные экземпляра и attr_accessor
- 5. Переменные экземпляра класса Ruby в подклассах
- 6. Переменные экземпляра переменных переменных в Ruby
- 7. Переменные экземпляра класса Ruby и наследование
- 8. Наследовать переменные экземпляра класса на Ruby?
- 9. Как просмотреть переменные экземпляра класса
- 10. Переменные экземпляра и класса
- 11. Переменные экземпляра экземпляра и переменные экземпляра в Ruby
- 12. Статические переменные - это переменные класса-экземпляра?
- 13. Переменные экземпляра объекта внутри класса
- 14. python: переменные класса и переменные экземпляра
- 15. Метод экземпляра Ruby класса def initialize: метод экземпляра или класса?
- 16. класса Python переменные и переменные экземпляра спутанность
- 17. Переменные класса, переменные экземпляра и наследование
- 18. CoffeeScript частного класса Переменные экземпляра
- 19. Переменная экземпляра класса Ruby класса
- 20. Использование переменных экземпляра в методах класса - Ruby
- 21. Солить как переменные класса, так и переменные экземпляра?
- 22. Переменные экземпляра экземпляра Ruby от другого метода
- 23. Статические/переменные экземпляра в ruby
- 24. attr_accessor против attr_reader и переменные экземпляра
- 25. Как перебирать переменные экземпляра в переменных экземпляра?
- 26. методы понимания класса и экземпляра переменные
- 27. Ruby: Расширенные переменные экземпляра
- 28. Переменные экземпляра Ruby nil
- 29. Как преобразовать переменные класса в переменные экземпляра в Python?
- 30. Когда переменные экземпляра Ruby устанавливаются?
Пройдите свой путь через «[Ясно видеть метаклассы] (http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html)"; это очень полезно при попытке понять, как работают классы и объекты Ruby. –