2015-03-18 6 views
1

Я понимаю, что когда мы определяем переменный класс рубина он предшествует @@variableName, но в этом кодеЧто такое переменная в классе?

class Hello 
    @var2 
    @@var3=0 
    def foo1 
     return @var1 
    end 
    def set_foo1(par1) 
     @var1=par1 
    end 
end 


Я понимаю, что var3 является переменным классом и должен быть инициализирован с некоторым значением. Но как насчет var2? Является ли var2 по-прежнему соответствовать объекту?

Когда я назвал программу с obj1.var2=100 я получаю noMethodError

Кроме того, когда я называю путы Hello.var3 я получить тот же noMethodError

Может кто-нибудь пожалуйста, объяснить, где я получаю это неправильно?

+1

'@ var2' - это переменная экземпляра, а' @@ var3' - это переменная класса. Если вы хотите получить доступ к ним из-за пределов определения класса, вам нужны геттеры/сеттеры. * Например, внутри 'class Hello',' def var2 @ var2 end' и т. Д. – lurker

+0

Итак, чтобы получить доступ к этим переменным, нам нужно получить к ним доступ только через функцию? – SeasonalShot

+0

Делает ИДЕАЛЬНОЕ чувство. Благодарю. – SeasonalShot

ответ

1

@var2 - это переменная экземпляра класса, а @@var3 - это переменная иерархии классов.

Статья об usage and differences между обоими из них. Важно помнить: когда вы объявляете переменную класса hierachy, она распределяется между классом и всеми нисходящими (наследующими) классами. Это редко то, что вы хотите.

+0

Спасибо. В связанной теме нет смысла объявлять переменную с помощью одного '@' внутри методов класса? (Поскольку метод класса может обращаться только к переменной класса и поэтому мы определяем double @@) – SeasonalShot

+0

Nope. В зависимости от варианта использования может иметь смысл использовать переменную экземпляра класса (например, для глобального состояния). В то время как я едва ли могу думать о хорошем примере для переменной иерархии классов. Я бы сказал, что переменная экземпляра класса всегда предпочтительнее переменной класса. И позже почти каждый раз плохое решение. – spickermann

0

Классы - это объекты, подобные любому другому объекту. Объекты могут иметь переменные экземпляра. Ergo, классы могут иметь переменные экземпляра.

В этом нет ничего особенного. Это очень важно понять в Ruby.

Смежные вопросы