Има метод за тази лудост...
class Example
@foo # class instance variable
@@bar # class variable
def fun1
@baz # instance variable
end
end
Променливи на екземпляра
Променливите на екземпляра (@foo
и @baz
в примера) винаги започват с @
и те винаги принадлежат на независимо от обекта, към който се отнася: или обект от класа, или класа обект, представляващ клас. Препратка към променлива на екземпляр в дефиниция на клас или метод на клас е напълно различна от препратка към променлива на екземпляр в метод на екземпляр.
Наследяване
Тъй като променливите на екземпляра не са дефинирани от клас, те не са свързани с механизма за наследяване — те просто се създават, когато им се присвои стойност. Следователно променливите на екземпляра на класа, които са просто променливи на екземпляра на обекта Class, който представлява клас, не се наследяват.
Променливи на класа
Променливите на класа са видими и споделени от методите на класа и методите на екземпляра на класа, а също и от самата дефиниция на класа. Променливите на класа могат да се използват в методи на екземпляр, методи на клас и в самата дефиниция на клас, извън всеки метод. Променливите на класа винаги се оценяват по отношение на обекта на класа, създаден от включващия оператор за дефиниция на клас.
Променлива на екземпляр на клас срещу променлива на екземпляр
Недостатък на променливите на екземпляр на класа е, че те не могат да се използват в методите на екземпляр, както могат променливите на класа. Друг недостатък е възможността да ги объркате с обикновените променливи на екземпляра. Предимството на променливите на екземпляра на класа пред променливите на класа е свързано с объркващото поведение на променливите на класа при подкласиране на съществуващ клас: ако даден клас използва променливи на клас, тогава всеки подклас може да промени поведението на класа и всичките му наследници чрез промяна на стойността на променливата на споделения клас. Това е силен аргумент за използването на променливи на екземпляр на клас вместо променливи на клас.
Голяма част от това е от отличния "Езикът за програмиране Ruby"
person
JRL
schedule
08.04.2010