2012-01-12 2 views
2

Я просто изучаю Ruby и имею и имею чрезвычайно важный вопрос. Является ли разница между четырьмя типами переменных, в основном, просто областью. Таким образом, локальные переменные могут использоваться только в текущем блоке, переменные экземпляра в текущем экземпляре, глобальные переменные в каждой области видимости и, наконец, переменные класса в текущем классе? Большое спасибо!В чем разница между локальными переменными, переменными экземпляра, глобальными переменными и переменными класса?

+0

Uhmmm ... всякий раз, когда я запутываюсь по переменной области видимости на любом языке программирования X, я делаю быстрые эксперименты по доступу к переменным в разных областях моего кода. Я считаю, что лучше помню правила определения области обзора, вместо того, чтобы просто читать документацию/спрашивать об этом. Плюс, я нахожу это намного быстрее.^_^ – skytreader

ответ

0

У вас все в порядке, хотя есть несколько морщин . Переменные класса (@@ foo) могут быть доступны как из методов класса, так и из методов экземпляра класса.

Они ведут себя несколько неинтуитивно по отношению к наследованию: если вы установите такую ​​переменную в базовом классе и снова установите ее в подклассе, вы измените значение для всех классов в иерархии. Если вы используете переменные класса для хранения настроек, это часто не то, что вы хотите - вы хотите, чтобы подклассы могли «переопределять» значения из базового класса, фактически не изменяя их для базового класса. Rails предоставляет class_attribute для этого: он создает методы доступа, которые имеют такое поведение.

Наконец, не совсем отдельный тип, но поскольку классы являются объектами, есть также переменные экземпляра класса. Они ничего не делают в отношении наследования - каждый объект класса в иерархии имеет свои собственные полностью независимые. В отличие от переменных класса экземпляры не могут напрямую манипулировать переменными экземпляра класса.

+1

Разница между переменными класса и переменными экземпляра класса является одной из вещей, которые всегда вызывают людей в рубине. Хорошее обсуждение этой концепции: http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/ –

+0

Большое спасибо за помощь! –

0

У вас все в порядке. Разница - это просто масштаб.

0

Рад, что вы смогли понять это интуитивно. Разница - просто масштаб (однако то, как они рассматриваются в памяти, довольно разные).

Смежные вопросы