Переменные класса действительно никогда не требуется. Но причина не в том, что они разделены. Я имею в виду, что хорошо избегать совместного состояния, где вы можете, но это не настоящая проблема.
Причина, по которой они рекомендованы, такова, как показано в этой статье, они действительно запутывают. В частности, переменные класса класса разделяются его подклассами и экземплярами его подклассов. Например:
class Parent
end
class Child1 < Parent
@@class_var = "Child1's"
end
class Child2 < Parent
@@class_var = "Child2's"
end
С этим кодом, Child1 и его экземпляры будут все видеть переменный класс с именем @@class_var
со значением "Child1's"
и Child2 и его экземпляры будут все видеть переменный класс с именем @@class_var
со значением "Child2's"
. Но предположим, что в дальнейшем мы заново Родитель и написать следующее:
class Parent
@@class_var = "Parent's"
end
Теперь Родитель и экземпляры, которые он создает все увидим переменную класса с именем @@class_var
со значением "Parent's"
. Но это еще не все.Теперь, когда родительский класс имеет эту переменную, Child1 и Child2 внезапно обмениваются переменной, поэтому все @@class_var
s имеют значение "Parent's"
. И если вы переназначите переменную в Child1, она по-прежнему будет использоваться совместно, поэтому все классы будут обновлены. Как странно!
Вместо переменных классов, вы можете просто использовать переменный экземпляр класса, например:
class Parent
@class_var = "Parent's"
def self.class_var
@class_var
end
end
class Child1 < Parent
@class_var = "Child1's"
end
class Child2 < Parent
@class_var = "Child2's"
end
Теперь Parent.class_var
вернется «Родитель», Child1.class_var
вернется «Child1» и Child2.class_var
вернется «Child2-х »- точно так же, как вы ожидаете.
Значит, @plays и @@ играют в этом случае точно идентичны? Я понимаю, почему плохая практика заключается в соединении точек между тем, что вы говорите, и статьей. – stanigator
** Это неправильно **. '@@' - это переменная класса, а не глобальная переменная. '@ play' и' @@ играет' ** не ** то же самое. Вы также не разрабатываете вообще * почему * это может быть плохой практикой. –
Согласен. посмотри мой ответ ниже – ctilley79