Es un error común que hacen los programadores de Java al llegar a Ruby, y uno de los grandes saltos conceptuales que tuve que resolver. Al principio parece extraño, pero en realidad es uno de los aspectos más interesantes de Ruby: todo el código es ejecutable, incluidas las definiciones de clases.
Por lo tanto, las variables de instancia se deben declarar dentro de los métodos. Tiene que ver con cómo se evalúa el "yo". 'uno mismo' es el objeto actual. El intérprete operaciones de búsqueda llamadas a métodos y las referencias a variables primero en 'auto':
class Fish
@var = "foo" # here 'self' == Fish, the constant which contains the class object
def foo
# do foo
end
end
fish = Fish.new
fish.foo # here 'self' == fish, an instance of Fish
En una definición de clase, 'yo' se establece para ser el objeto de la clase que se define, por lo que cualquier referencia dentro de una definición de clase se refieren a ese objeto de clase, en este caso Fish.
Cuando se invoca un método en una instancia de Fish, sin embargo, self se establece para ser el receptor de la llamada, la instancia particular de Fish. Entonces, fuera de una definición de método, el yo es el objeto de clase. Dentro de un método, self es la instancia del receptor. Esta es la razón por la cual @var fuera de una definición de método es más parecido a una variable estática en Java, y @var dentro de una definición de método es una variable de instancia.
no deben' t que sea @@ var en el primer bloque de código? – Jean
Estoy leyendo "The Well-Grounded Rubyist" (http://manning.com/black2/) por David Black. Hace un gran trabajo al explicar todos los matices en esta área –
Jean: No. Si utilicé '@@ var', las subclases anularían las clases principales. Ver el enlace de hobodave. Específicamente cómo '2' se anula en el ejemplo. –