Cierto, es como dices, con el arroba prefijado.
Una vez tienes attr_accesor puedes acceder a la variable a através de la creación de una nueva clase. Por ejemplo supongamos que tengo esta clase:
class Rectangulo
attr_accessor :base, :altura
end
Para modificar los atributos (como se le llama a una variable propia de una clase) simplemente se instancia (crea) un nuevo objeto de dicha clase para obtener acceso a dichos atributos de la siguiente forma:
rect = Rectangulo.new
rect.base = 2
rect.altura = 4
puts "Base: #{rect.base}, Altura: #{rect.altura}""
también se pueden usar attr_reader, o attr_writer dependiendo si es una variable que solo se puede leer o solo se puede escribir.
Podemos también definir un método de la siguiente manera y obtener un valor de el:
class Rectangulo
attr_accessor :base, :altura, :area
def area
@area = @base * @altura
end
end
rect = Rectangulo.new
rect.base = 2
rect.altura = 4
puts "Base: #{rect.base}, Altura: #{rect.altura}"
puts rect.area
Podemos agregar un inicializador (no confundir con constructor, este no es un constructor, porque estrictamente no construye el objeto, solo le da valores a los atributos) como el siguiente (un inicializador siempre se debe escribir con initialize):
class Rectangulo
attr_accessor :base, :altura, :area
def initialize(base, altura)
@base = base
@altura = altura
end
def area
@area = @base * @altura
end
end
Lo que nos permite entonces inicializar los atributos del objeto en el momento de su instanciación, entonces de la siguiente manera podremos crear un nuevo objeto de tipo rectangulo:
class Rectangulo
attr_accessor :base, :altura, :area
def initialize(base, altura)
@base = base
@altura = altura
end
def area
@area = @base * @altura
end
end
rect = Rectangulo.new(2, 4)
puts "Base: #{rect.base}, Altura: #{rect.altura}"
puts rect.area
Verás que de esta forma si intentas crear el objeto sin mandarle valores para que asigne a sus atributos así:
rect= Rectangulo.new
Lanzará un error de argumentos insuficientes. Lo que está genial porque en el método area ya no tendremos que preocuparnos si los valores de la base y la altura están inicializados para poder realizar la operación.
Saludos.