Я просто изучаю Ruby и имею и имею чрезвычайно важный вопрос. Является ли разница между четырьмя типами переменных, в основном, просто областью. Таким образом, локальные переменные могут использоваться только в текущем блоке, переменные экземпляра в текущем экземпляре, глобальные переменные в каждой области видимости и, наконец, переменные класса в текущем классе? Большое спасибо!В чем разница между локальными переменными, переменными экземпляра, глобальными переменными и переменными класса?
ответ
У вас все в порядке, хотя есть несколько морщин . Переменные класса (@@ foo) могут быть доступны как из методов класса, так и из методов экземпляра класса.
Они ведут себя несколько неинтуитивно по отношению к наследованию: если вы установите такую переменную в базовом классе и снова установите ее в подклассе, вы измените значение для всех классов в иерархии. Если вы используете переменные класса для хранения настроек, это часто не то, что вы хотите - вы хотите, чтобы подклассы могли «переопределять» значения из базового класса, фактически не изменяя их для базового класса. Rails предоставляет class_attribute
для этого: он создает методы доступа, которые имеют такое поведение.
Наконец, не совсем отдельный тип, но поскольку классы являются объектами, есть также переменные экземпляра класса. Они ничего не делают в отношении наследования - каждый объект класса в иерархии имеет свои собственные полностью независимые. В отличие от переменных класса экземпляры не могут напрямую манипулировать переменными экземпляра класса.
Разница между переменными класса и переменными экземпляра класса является одной из вещей, которые всегда вызывают людей в рубине. Хорошее обсуждение этой концепции: http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/ –
Большое спасибо за помощь! –
У вас все в порядке. Разница - это просто масштаб.
Рад, что вы смогли понять это интуитивно. Разница - просто масштаб (однако то, как они рассматриваются в памяти, довольно разные).
- 1. Разница между постоянными переменными и глобальными переменными
- 2. Разница между переменными класса и переменными экземпляра класса?
- 3. В чем разница между глобальными переменными и локальными переменными при объявлении указателя на массив?
- 4. Путаница между локальными переменными, переменными экземпляра и символами
- 5. Разница между переменными привязками и переменными?
- 6. В чем разница между переменными класса lazy и локальными переменными lazy в закрытии?
- 7. Разница между внешними и глобальными переменными?
- 8. Разница между локальными переменными и аргументами
- 9. В чем разница между переменными?
- 10. В чем разница между переменными local и экземпляра в Java
- 11. Разница между локальными и переменными экземпляра в ruby
- 12. В чем разница между указателями и глобальными переменными в C?
- 13. В чем разница между глобальными переменными и #define в с
- 14. В чем разница между переменными сеанса и глобальными переменными в php?
- 15. Проблема с глобальными переменными
- 16. Различия между статическими и глобальными переменными
- 17. проблемы с глобальными переменными
- 18. Различия между классными и глобальными переменными
- 19. Какая польза от дискриминации между локальными и глобальными переменными?
- 20. Проблема с глобальными переменными
- 21. Проблемы с глобальными переменными
- 22. Проблема с глобальными переменными
- 23. Drools сериализации глобальными переменными
- 24. Разница между объявляющими переменными
- 25. разница между переменными заданий
- 26. forward_call с локальными переменными
- 27. LINQ над локальными переменными
- 28. Mockito с локальными переменными
- 29. Передача переменных между функциями и глобальными переменными
- 30. Выбор между датасторе и глобальными переменными
Uhmmm ... всякий раз, когда я запутываюсь по переменной области видимости на любом языке программирования X, я делаю быстрые эксперименты по доступу к переменным в разных областях моего кода. Я считаю, что лучше помню правила определения области обзора, вместо того, чтобы просто читать документацию/спрашивать об этом. Плюс, я нахожу это намного быстрее.^_^ – skytreader