Променливите на инстанцията започват със знак (@) и могат да бъдат препращани само в методите на клас. Те се различават от локалните променливи по това, че не съществуват в нито един конкретен обхват. Вместо това се съхранява подобна променлива таблица за всеки екземпляр от клас. Променливите на инстанцията живеят в клас екземпляр, така че докато този екземпляр остава жив, толкова ще са и променливите на инстанцията.
Променливите на инстанцията могат да бъдат позовавани във всеки метод от този клас. Всички методи на клас използват един и същ инстанция променлива таблица, за разлика от локалните променливи, където всеки метод ще има различна таблица с променливи. Възможно е обаче да получите достъп до променливи инстанции, без първо да ги дефинирате. Това няма да доведе до изключение, но стойността на променливата ще бъде нула и ще бъдете издадени предупреждение, ако стартирате Ruby с -w превключване.
Този пример демонстрира използването на променливи инстанции. Имайте предвид, че вертеп съдържа
-w превключвател, който ще отпечатва предупреждения, ако се появят. Също така обърнете внимание на неправилното използване извън метод в обхвата на класа. Това е неправилно и се обсъжда по-долу.Защо е @тест променлива неправилна? Това е свързано с обхвата и как Ruby изпълнява нещата. В рамките на метод обхватът на променливата инстанция се отнася до конкретната инстанция от този клас. Въпреки това, в обхвата на класа (вътре в класа, но извън всякакви методи), обхватът е екземпляр клас обхват. Ruby реализира йерархията на класа чрез инстанциране клас обекти, така че има a втора инстанция на игра тук. Първият инстанция е инстанция на клас клас, и това е мястото @тест ще отида. Втората инстанция е инстанцията на TestClass, и това е мястото @value ще отида. Това става малко объркващо, но не забравяйте никога да не използвате @instance_variables извън методите. Ако имате нужда от общокласни хранилища, използвайте @@ class_variables, който може да се използва навсякъде в обхвата на класа (вътре или извън методите) и ще се държи същото.
Обикновено не можете да получите достъп до променливи екземпляри отвън на обект. Например в горния пример не можете просто да се обадите t.value или т. @ стойност за достъп до променливата на инстанцията @value. Това би нарушило правилата на капсулиране. Това важи и за случаите на дочерните класове, те нямат достъп до променливи екземпляри, принадлежащи към родителския клас, въпреки че технически са от същия тип. Така че, за да осигурите достъп до променливи от инстанция, Accessor трябва да бъдат декларирани методи.
Следващият пример демонстрира как могат да се напишат методите на аксесоари. Имайте предвид обаче това рубин предоставя пряк път и че този пример съществува само за да ви покаже как работят методите на аксесоара. Обикновено не е обичайно да се виждат написани по този начин методи за достъп, освен ако не е необходима някаква допълнителна логика.
Преките пътища правят нещата малко по-лесни и по-компактни. Има три от тези помощни методи. Те трябва да се изпълняват в обхвата на класа (вътре в класа, но извън каквито и да е методи) и ще определят динамично методите, подобно на методите, дефинирани в горния пример. Тук не се случва никаква магия и те изглеждат като езикови ключови думи, но всъщност са просто динамично определящи методи. Също така тези аксесоари обикновено са в горната част на класа. Това дава на читателя незабавен преглед кои променливи членове ще бъдат налични извън класа или в детските класове.
Има три от тези методи за достъп. Те вземат списък със символи, описващи променливите на екземпляра, които трябва да бъдат достъпни.
- attr_reader - Определете методите на "четене", като например име метод в горния пример.
- attr_writer - Определете "писателски" методи като например възрастови = метод в горния пример.
- attr_accessor - Определете и методите „четец“ и „писател“.
Кога да използвате променливи за инстанции
Сега, когато знаете какви са променливите на инстанциите, кога ги използвате? Променливите на инстанцията трябва да се използват, когато представляват състоянието на обекта. Име и възраст на ученика, техните оценки и т.н. Те не трябва да се използват за временно съхранение, за това са локалните променливи. Въпреки това, те могат да бъдат използвани за временно съхранение между извиквания на методи за многоетапни изчисления. Ако обаче правите това, може да искате да преосмислите състава на метода си и вместо това да превърнете тези променливи в параметри на метода.