В чем разница между локальными переменными, переменными экземпляра, глобальными переменными и переменными класса? - PullRequest
2 голосов
/ 12 января 2012

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

Ответы [ 3 ]

0 голосов
/ 12 января 2012

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

0 голосов
/ 12 января 2012

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

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

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

0 голосов
/ 12 января 2012

Вы правильно поняли.Разница только в объеме.

...