Имена переменных класса начинаются с символа @, и их область применения ограничивается областью видимости внутри класса, то есть той областью, на которую можно сослаться, используя переменную self . Два различных объекта, даже если они относятся к одному класса, могут иметь различные значения их переменных экземпляра класса. Снаружи объекта, переменные экземпляра не могут быть изменены или просмотрены (то есть переменные экземпляра класса в Ruby никогда не бывают публичными, public ), исключая те случаи, когда программист предусматривает для этого специальные методы. Как и в случае глобальных переменных, переменные экземпляра класса имеют значение nil , до тех пор, пока не будут инициализированы.
Переменные экземпляра в Ruby не нуждаются в объявлении. Это подразумевает гибкость структуры объекта. Фактически, каждая переменная экземпляра класса динамически добавляется в объект, когда впервые появляется в объекте.
- ruby> class InstTest
- | def set_foo(n)
- | @foo = n
- | end
- | def set_bar(n)
- | @bar = n
- | end
- | end
- nil
- ruby> i = InstTest.new
- #<InstTest:0x83678>
- ruby> i.set_foo(2)
- 2
- ruby> i
- #<InstTest:0x83678 @foo=2>
- ruby> i.set_bar(4)
- 4
- ruby> i
- #<InstTest:0x83678 @foo=2, @bar=4>
Заметьте выше, что объект i не сообщает о значении @bar до тех пор, пока не будет вызван метод set_bar.