Переменные экземпляра в Ruby

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

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

Этот пример демонстрирует использование переменных экземпляра. Обратите внимание, что притон содержит -w переключатель, который будет печатать предупреждения, если они появляются. Также обратите внимание на неправильное использование вне метода в области видимости класса. Это неверно и обсуждается ниже.

instagram viewer

Почему @тестовое задание переменная неверна? Это связано с областью действия и тем, как Ruby реализует вещи. Внутри метода область видимости переменной экземпляра ссылается на конкретный экземпляр этого класса. Однако в области видимости класса (внутри класса, но вне каких-либо методов) область видимости является экземпляр класса сфера. Ruby реализует иерархию классов путем создания экземпляров Учебный класс объекты, так что есть второй экземпляр в игре здесь. Первый экземпляр является примером Учебный класс класс, и это где @тестовое задание Пойду. Вторым примером является создание TestClassи это где @значение Пойду. Это немного сбивает с толку, но не забывайте никогда не использовать @instance_variables вне методов. Если вам нужно хранилище для всего класса, используйте @@ class_variables, который может использоваться где угодно в области видимости класса (внутри или снаружи методов) и будет вести себя одинаково.

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

Следующий пример демонстрирует, как могут быть написаны методы доступа. Тем не менее, обратите внимание, что Рубин предоставляет ярлык, и этот пример существует только для того, чтобы показать вам, как работают методы доступа. Обычно методы доступа, написанные таким образом, не распространены, если для средства доступа не требуется какая-то дополнительная логика.

Ярлыки делают вещи немного проще и компактнее. Есть три из этих вспомогательных методов. Они должны выполняться в области видимости класса (внутри класса, но вне каких-либо методов) и будут динамически определять методы, очень похожие на методы, определенные в приведенном выше примере. Здесь не происходит никакой магии, и они выглядят как ключевые слова языка, но на самом деле они просто динамически определяют методы. Кроме того, эти средства доступа обычно идут в верхней части класса. Это дает читателю мгновенный обзор того, какие переменные-члены будут доступны вне класса или для дочерних классов.

Есть три из этих методов доступа. Каждый из них принимает список символов, описывающих переменные экземпляра, к которым осуществляется доступ.

  • attr_reader - Определите методы «читателя», такие как имя Метод в приведенном выше примере.
  • attr_writer - Определить методы «писателя», такие как возраст = Метод в приведенном выше примере.
  • attr_accessor - Определите методы «читатель» и «писатель».

Когда использовать переменные экземпляра

Теперь, когда вы знаете, что такое переменные экземпляра, когда вы их используете? Переменные экземпляра следует использовать, когда они представляют состояние объекта. Имя и возраст учащегося, его оценки и т. Д. Они не должны использоваться для временного хранения, для этого предназначены локальные переменные. Однако их можно использовать для временного хранения между вызовами методов для многоступенчатых вычислений. Однако, если вы делаете это, вы можете переосмыслить состав метода и вместо этого превратить эти переменные в параметры метода.

instagram story viewer