173 votes

Que veut dire @@variable en Ruby ?

Quelles sont les variables Ruby précédés avec double arobas ( `` ) ? Ma compréhension d’une variable précédées d’un arobase est que c’est une variable d’instance, comme ça en PHP :

Version de PHP

Ruby équivalent

En quoi consiste le double arobase `` signifie, et comment est-il différent d’un seul arobase ?

248voto

Brandon Tilley Points 49142

Une variable avec le préfixe @ est une variable d'instance, tandis que le préfixe @@ est une variable de classe. Découvrez l'exemple suivant; sa sortie est dans les commentaires à la fin de l' puts lignes:

class Test
  @@shared = 1

  def value
    @@shared
  end

  def value=(value)
    @@shared = value
  end
end

class AnotherTest < Test; end

t = Test.new
puts "t.value is #{t.value}" # 1
t.value = 2
puts "t.value is #{t.value}" # 2

x = Test.new
puts "x.value is #{x.value}" # 2

a = AnotherTest.new
puts "a.value is #{a.value}" # 2
a.value = 3
puts "a.value is #{a.value}" # 3
puts "t.value is #{t.value}" # 3
puts "x.value is #{x.value}" # 3

Vous pouvez voir qu' @@shared est partagé entre les classes; le réglage de la valeur dans une instance de l'un des changements de la valeur pour toutes les autres instances de cette classe, et même des enfants de classes, d'où une variable nommée @shared, avec un @, ne serait pas.

[Mise à jour]

Comme Phrogz mentionne dans les commentaires, il s'agit d'un idiome en Ruby pour suivre le niveau de la classe de données avec une variable d'instance de la classe elle-même. Cela peut être un sujet délicat pour envelopper votre esprit autour, et il ya beaucoup d' autres lectures sur le sujet, mais pensez à ce sujet que la modification de l' Class classe, mais seulement l'instance de l' Class classe que vous travaillez avec. Un exemple:

class Polygon
  class << self
    attr_accessor :sides
  end
end

class Triangle < Polygon
  @sides = 3
end

class Rectangle < Polygon
  @sides = 4
end

class Square < Rectangle
end

class Hexagon < Polygon
  @sides = 6
end

puts "Triangle.sides:  #{Triangle.sides.inspect}"  # 3
puts "Rectangle.sides: #{Rectangle.sides.inspect}" # 4
puts "Square.sides:    #{Square.sides.inspect}"    # nil
puts "Hexagon.sides:   #{Hexagon.sides.inspect}"   # 6

J'ai inclus l' Square exemple (qui, de sorties nil) pour démontrer que cela peut ne pas se comporter à 100% comme vous vous attendez; l' article que j'ai lié ci-dessus a beaucoup d'informations supplémentaires sur le sujet.

Aussi garder à l'esprit que, comme avec la plupart des données, vous devez être extrêmement prudent avec les variables de classe dans un environnement multithread, comme par dmarkow commentaire.

38voto

Shaunak Points 3769

@ - Variable d'Instance d'une classe
@@ - Variable de classe, aussi appelée variable statique dans certains cas

Une variable de classe est une variable qui est partagée entre toutes les instances d'une classe. Cela signifie qu'une seule valeur de la variable existe pour tous les objets instanciés à partir de cette classe. Si une instance de l'objet change la valeur de la variable, la nouvelle valeur sera essentiellement modifier pour toutes les autres instances de l'objet.

Une autre façon de penser la pensée de la classe de variables comme des variables globales dans le contexte d'une classe unique. Classe les variables sont déclarées en préfixant le nom de la variable avec deux @ caractères (@@). Variables de classe doit être initialisé au moment de la création

11voto

``désigne une classe variable, c'est-à-dire il peut être héréditaire.

Cela signifie que si vous créez une sous-classe de la classe, elle héritera de la variable. Donc si vous avez une classe avec la variable de classe , puis si vous créez un alors il aura trop la variable de classe

1voto

khan Points 106

@ = variable d’instance où en tant que @@ = variable de classe

la variable d’instance est comme, qui est part avec/objets d’instance d’une classe afin d’accéder à la variable d’instance que nous devons définir les poseurs et les acquéreurs pour cette variable d’instance

considérant que c’est comme la variable de classe, qui est partagé par toutes les instances/objets d’une classe ou, en d’autres termes, vous pouvez dire que c’est une variable globale, donc variable globale peut être consulté dans le monde

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X