Les variables d’instància no poden ser consultades desde fora de la definició de la classe.
class Tutor
def initialize(name)
@nombre = name
puts @nombre
end
end
uriel = Tutor.new("Uriel")
jose = Tutor.new("José")
# puts uriel.nombre
# puts jose.nombre
Output
Uriel
José
1. Què tenen d’especial aquestes vareables?
Es pot accedir a elles des de qualsevol part de dins de l’objecte, no importa si es declara en un mètode i després accedim des d’altre mètode.
class Tutor
def initialize(name)
@nombre = name
end
def say_my_name
puts @nombre
end
end
uriel = Tutor.new("Uriel")
jose = Tutor.new("José")
uriel.say_my_name
jose.say_my_name
# puts uriel.nombre
# puts jose.nombre
Output
Uriel
José
Encara que la variable @nombre
va estar assignada des del constructor, però també la podem cridar des del mètode say_my_name
.
3. Si les variables instància no poden ser alterades o llegides des de l’exterior com llegir aquesta propietat de l’objecte?
Utilitzem mètodes accesors. Aquests mètodes defineixen com podem cambiar, afinar o modificar una determinada propietat i al mateix temps com llegir-la.
Els mètodes accessors són de dos tipus get
i set
. Exemple:
class Tutor
def initialize(name)
@nombre = name
end
def get_name
@nombre
end
def set_nombre(nombre)
@nombre
end
end
- El mètode accessor
get
(obtenir) serverixen per a llegir. - El mètode accessor
set
(colocar o assignar) serveix per a assignar o modificar una propietat.
A l’exemple es veu com imprimim el nom, el modifiquem, el reasignem a Marcos
i el tornem a imprimir.
class Tutor
def initialize(name)
@nombre = name
end
def get_nombre
@nombre
end
def set_nombre(nombre)
@nombre = nombre
end
end
uriel = Tutor.new("Uriel")
jose = Tutor.new("José")
puts uriel.get_nombre
uriel.set_nombre("Marcos")
puts uriel.get_nombre
# puts uriel.nombre
# puts jose.nombre
Output
Uriel
Marcos
Això comprova que el codi funciona.
Que el mètode get
i set
comencen precisament amb aquestes paraules és una convenció a molts llenguatges, com Java, però no a Ruby. En Ruby no es fa així.
El que diferencia en Ruby a un get
i a un set
és el caràcter =
.
En comptes de:
def get_nombre
@nombre
end
def set_nombre(nombre)
@nombre = nombre
end
Així:
def nombre
@nombre
end
def nombre=(nombre)
@nombre = nombre
end
Això fa que el codi siga més fàcil de llegir i transparent.
D’aquesta manera els cridem així:
uriel.nombre = "Marcos"
puts uriel.nombre
En comptes de:
uriel.set_nombre("Marcos")
Tot junt:
class Tutor
def initialize(name)
@nombre = name
end
def get_nombre
@nombre
end
def set_nombre(nombre)
@nombre = nombre
end
end
uriel = Tutor.new("Uriel")
jose = Tutor.new("José")
puts uriel.nombre
uriel.nombre = "Marcos"
puts uriel.nombre
# puts uriel.nombre
# puts jose.nombre
4. Mètodes per no escriure més del compte.
class Tutor
attr_accessor: nombre
attr_reader: nombre
attr_writer: nombre
end
Aquest són els tres mètodes accessors que Ruby té.
attr_accessor: nombre
defineix tant el get
com el set
.
attr_reader: nombre
defineix sols defineix el get
.
attr_writer: nombre
defineix sols defineix el set
.
Exemple:
class Tutor
attr_accessor :nombre
def initialize(name)
@nombre = name
end
end
uriel = Tutor.new("Uriel")
jose = Tutor.new("José")
puts uriel.nombre
uriel.nombre = "Marcos"
puts uriel.nombre
Output
Uriel
Marcos