¿Cuáles son las variables de Ruby precedidas con doble en signos ( @@
)? Entiendo que una variable precedida por un signo at es que es una variable de instancia, como esta en PHP:
Versión PHP
class Person {
public $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
Equivalente de rubí
class Person
def set_name(name)
@name = name
end
def get_name()
@name
end
end
¿Qué significa el doble en el signo @@
y en qué se diferencia de un solo en el signo?
@
internosself
) no variables de clase (@@
). Vea la letanía de razones en las respuestas a continuación.Respuestas:
Una variable con prefijo
@
es una variable de instancia , mientras que una con prefijo@@
es una variable de clase . Mira el siguiente ejemplo; su salida está en los comentarios al final de lasputs
líneas:Puede ver que
@@shared
se comparte entre las clases; establecer el valor en una instancia de uno cambia el valor para todas las demás instancias de esa clase e incluso clases secundarias, donde una variable llamada@shared
, con una@
, no sería.[Actualizar]
Como Phrogz menciona en los comentarios, es un lenguaje común en Ruby rastrear datos a nivel de clase con una variable de instancia en la clase misma . Este puede ser un tema difícil de entender, y hay mucha lectura adicional sobre el tema, pero piense en ello como una modificación de la
Class
clase, pero solo la instancia de laClass
clase con la que está trabajando. Un ejemplo:Incluí el
Square
ejemplo (que producenil
) para demostrar que esto puede no comportarse al 100% como esperabas; El artículo que he vinculado anteriormente tiene mucha información adicional sobre el tema.También tenga en cuenta que, como con la mayoría de los datos, debe tener mucho cuidado con las variables de clase en un entorno multiproceso , según el comentario de dmarkow.
fuente
ruby class << self end
bloque, específicamente el operador <<.class << self
ver esto@
- Variable de instancia de una clase@@
- Variable de clase, también llamada como variable estática en algunos casosUna variable de clase es una variable que se comparte entre todas las instancias de una clase. Esto significa que solo existe un valor variable para todos los objetos instanciados de esta clase. Si una instancia de objeto cambia el valor de la variable, ese nuevo valor cambiará esencialmente para todas las demás instancias de objeto.
Otra forma de pensar en las variables de clase es como variables globales dentro del contexto de una sola clase. Las variables de clase se declaran con el prefijo del nombre de la variable con dos
@
caracteres (@@
). Las variables de clase deben inicializarse en el momento de la creación.fuente
@@
denota una variable de clase, es decir, se puede heredar.Esto significa que si crea una subclase de esa clase, heredará la variable. Entonces, si tiene una clase
Vehicle
con la variable de clase,@@number_of_wheels
entonces si crea unaclass Car < Vehicle
, también tendrá la variable de clase@@number_of_wheels
fuente
Vehicle
con la variable de clase,@@number_of_wheels
entonces si crea una,class Car < Vehicle
entonces también tendrá la variable de clase@@number_of_wheels
class Vehicle
con@number_of_wheels
,class Car < Vehicle
también tendrá una variable de instancia llamada@number_of_wheels
. La diferencia clave con las variables de clase es que las clases tienen la misma variable, por ejemplo, cambiar una cambia las otras.Los módulos @ y @@ también funcionan de manera diferente cuando una clase extiende o incluye ese módulo.
Así dado
Luego obtienes los resultados a continuación que se muestran como comentarios
Por lo tanto, use @@ en los módulos para las variables que desea que sean comunes a todos sus usos, y use @ en los módulos para las variables que desea separar para cada contexto de uso.
fuente
Las respuestas son parcialmente correctas porque @@ es en realidad una variable de clase que es por jerarquía de clase, lo que significa que es compartida por una clase, sus instancias y sus clases descendientes y sus instancias.
Esto dará salida
Por lo tanto, solo hay una misma variable @@ para las clases Persona, Estudiante y Graduado y todos los métodos de clase e instancia de estas clases se refieren a la misma variable.
Hay otra forma de definir una variable de clase que se define en un objeto de clase (recuerde que cada clase es en realidad una instancia de algo que en realidad es la clase Class pero es otra historia). Utiliza la notación @ en lugar de @@ pero no puede acceder a estas variables desde los métodos de instancia. Necesita tener envoltorios de métodos de clase.
Aquí, @people es individual por clase en lugar de jerarquía de clases porque en realidad es una variable almacenada en cada instancia de clase. Esta es la salida:
Una diferencia importante es que no puede acceder a estas variables de clase (o variables de instancia de clase que puede decir) directamente desde los métodos de instancia porque @people en un método de instancia se referiría a una variable de instancia de esa instancia específica de las clases Person o Student o Graduate .
Entonces, mientras que otras respuestas indican correctamente que @myvariable (con notación simple @) siempre es una variable de instancia, no significa necesariamente que no sea una sola variable compartida para todas las instancias de esa clase.
fuente