¿Variables de instancia de Ruby o variables locales?

Soy nuevo en el lenguaje Ruby. Entiendo que

@@count: Class variables @name: Instance variables my_string: Local variables 

Tengo en cuenta lo anterior. Sin embargo, encontré un código de Ruby como este:

 class HBaseController < ApplicationController ... def result conn = OkHbase::Connection.new(host: 'localhost', port: 9090, auto_connect: true) ... end end 

‘conn’ me confunde mucho.

¿Es ‘conn’ una variable de instancia, o una variable local? ¿Y cuál es el scope de ‘conn’?

Intento explicarlo con un pequeño ejemplo:

 class MyClass def meth conn = 1 end def result conn end end x = MyClass.new p x.result #-> test.rb:6:in `result': undefined local variable or method `conn' 

conn es desconocido. Intentemos llamar a meth antes:

 class MyClass def meth conn = 1 end def result conn end end x = MyClass.new x.meth # try to create conn p x.result #-> test.rb:6:in `result': undefined local variable or method `conn' 

Mismo resultado Así que conn no es una variable de instancia. Se define una variable local en la meth pero se desconoce fuera.

Probemos lo mismo con las variables de instancia:

 class MyClass def meth @conn = 1 end def result @conn end end x = MyClass.new p x.result #-> nil (no value assigned (*), but is is existing) x.meth # initialze @conn with a value p x.result #-> 1 

Con el uso de métodos de acceso usted define una variable de instancia implícita:

 class MyClass attr_reader :conn def meth conn = 1 end def result conn end end x = MyClass.new p x.result #-> nil (no value assigned (*), but is is existing) x.meth # define conn with a value p x.result #-> nil - the instance variable is not changed, a locale variable was used 

En el result del método, la conn es el método del lector conn . En el método de método es una variable de entorno local (esto puede ser confuso, porque ahora tienes una variable con el mismo nombre que una variable).

Si desea cambiar el valor de conn en el método de método, debe definir un self.conn y usar self.conn :

 class MyClass attr_reader :conn attr_writer :conn def meth self.conn = 1 end def result conn end end x = MyClass.new p x.result #-> nil (not defined yet, but is is existing) x.meth # define conn with a value p x.result #-> 1 

Puede reemplazar attr_reader y attr_writer con attr_accessor .

(*) Observación: no escribí ningún valor asignado , esto no es realmente correcto, nil también es un valor.

conn es una variable local (las variables locales comienzan con una letra minúscula o un guión bajo)

Contiene una instancia de OkHbase :: Connection

Probablemente el código que se omitió ... usa ese objeto. Debido a que es una variable local, una vez que se termina el método de result , la variable local ya no será accesible y el objeto se borrará de la memoria.

(Por supuesto, es posible que el código omitido asigne el objeto en relación con una variable de instancia o lo pase a algún otro método que lo haya almacenado en otro lugar)

En este caso, conn es una variable local.

EDITAR:

conn sería una variable de instancia si la tuvieras escrita como

@conn = OkHbase::Connection.new(host: 'localhost', port: 9090, auto_connect: true)

conn es local al result método

Los bloques crean un nuevo ámbito, al igual que los métodos y las declaraciones de clase. Curiosamente, if declaraciones no crean un nuevo ámbito local, las variables que declara dentro de una instrucción if están disponibles fuera.

 $ irb 1.9.3-p484 :001 > if true 1.9.3-p484 :002?> foo = 1 1.9.3-p484 :003?> end => 1 1.9.3-p484 :004 > foo => 1 1.9.3-p484 :005 > 1.times do 1.9.3-p484 :006 > bar = 1 1.9.3-p484 :007?> end => 1 1.9.3-p484 :008 > bar NameError: undefined local variable or method `bar' for main:Object from (irb):8 from irb:12:in `
'
    Intereting Posts