2012-04-23 4 views
11

Tenga en cuenta la siguiente clase de rubí muestraVariables normales Vs Variable de instancia en Ruby, ¿cuál es la diferencia?

class User 
    def hello 
    puts "hello" 
    end 
end 

ahora, para la inicialización. hay dos maneras

normales variables Variables

1.9.3p125 > tr = User.new 
=> #<User:0x98778c4> 
1.9.3p125 > tr.hello 
Hello world 
=> nil` 

de instancia:

1.9.3p125 > @tr = User.new 
=> #<User:0x9890f2c> 
1.9.3p125 > @tr.hello 
Hello world 
=> nil 

Ahora, en ambos casos funciona de la misma. Entonces, ¿cuál es la diferencia entre variable normal vs variable de instancia?

Respuesta

29

Un la variable normal tiene alcance solo dentro del contexto actual; una variable de instancia tiene alcance en una instancia de una clase. En su caso, están confundidos porque el contexto es main, que actúa como una instancia de Object.

Consideremos el siguiente, lo que puede hacer las cosas más claras

class User 
    def set_name 
    @name = "Bob" 
    surname = "Cratchett" 
    end 

    def hi 
    puts "Hello, " + @name 
    end 

    def hello 
    puts "Hello, Mr " + surname 
    end 
end 

irb(main):022:0> u = User.new 
=> #<User:0x29cbfb0> 
irb(main):023:0> u.set_name 
irb(main):024:0> u.hi 
Hello, Bob 
=> nil 
irb(main):025:0> u.hello 
NameError: undefined local variable or method `surname' for #<User:0x29cbfb0 @name="Bob"> 
2

Una variable local se puede usar solo dentro del método en el que está definida (o, cuando la variable se define en el nivel superior, solo fuera de cualquier método). Se puede usar una variable de instancia desde cualquier método que se invoque en la misma instancia.

He aquí un ejemplo donde se puede ver la diferencia:

@tr = User.new 

def foo 
    @tr.hello 
end 

foo 
# Hello World 


tr = User.new 

def bar 
    tr.hello 
end 

bar 
# Exception because tr is not accessible from within bar 
4

La variable normal se denomina variable local y es local a la construcción de código en el que se define (si se define en una método no se puede acceder fuera de ese método).

Una variable de instancia es local para una instancia específica de un objeto. Si un objeto cambia el valor de la variable de instancia, el cambio solo se produce para ese objeto.

También hay variables de clase local para todas las instancias de la clase:

@@class_variable = 'a class variable'

Y variables globales accesible desde cualquier lugar dentro del programa:

$global_variable = 'a global variable'

Cuestiones relacionadas