Variables en las clases de Ruby

Ruby permite cuatro tipos de variables:

  • Variable local, las variables locales son variables que están definidas en un método. Estas variables no están disponible fuera del método. Las variables locales empiezan con letra minúscula o guión bajo (_) variable_name
def method
  foo = Array.new
end

# foo no esta definida aqui, no existe
  • Variables de instancia, están disponible en todos los métodos de cualquier de cualquier instancia u objeto. Esto quiere decir que las variables de instancia cambian de un objeto a otro. Estas variables están precedidas por un @ seguidas del nombre de la variable @variable_name
def method
  @foo = "Hola!"
end

puts @foo
  • Variables de clase, están disponible en los diferentes objetos. Una variable de clase pertenece a la clase y es una característica de la clase. Están precedidas por @@ seguidas del nombre de la variable @@variable_name
class Foo
  @@variable = 0
  def counter
    @@variable += 1
    puts("Count: #@@variable")
  end
end

foo1 = Foo.new
foo2 = Foo.new

foo1.counter # 1
foo1.counter # 2
foo2.counter # 3
  • Variables globales, están disponible en todas las diferentes clases. Se definen con $ seguido del nombre de la variable $variable_name
class Foo
  $global_variable = "Global"
end

class Any
  def method
    puts($global_variable)
  end
end

any = Any.new
any.method # "Global"

Las variables creadas con @ crean instancias de variables en cada objeto, esto puede generar problemas si creamos dos módulos que tengan el mismo nombre en algunas variables, estas entrarán en colisión.

module MajorScales
  def majorNum
    @numNotes = 7 if @numNotes.nil?
    @numNotes # Return 7
  end
end

module PentatonicScales
  def pentaNum
    @numNotes = 5 if @numNotes.nil?
    @numNotes # Return 5?
  end
end

class ScaleDemo
  include MajorScales
  include PentatonicScales

  def initialize
    puts majorNum # Should be 7
    puts pentaNum # Should be 5
  end

end

ScaleDemo.new
# output
# 7
# 7

Como podemos ver tanto en MajorScales como en PentatonicScales hemos creado una variable con el mismo nombre lo que hace que en nuestra nueva clase ScaleDemo compartan esta variable en ambos, de manera que tienen el mismo valor ambas.

Ejemplo completo en phrogz

Más infromación sobre variables en tutorialspoint

Más información sobre clases en tutorialspoint