La única manera fácil de cambiar el estado de un objeto en Ruby es llamando a uno de sus métodos.
Ruby tiene tres niveles de protección:
1. Métodos Públicos: Los métodos pueden ser llamados por todos y no se aplica control de acceso. Recuerda que el método de inicialización es siempre privado.
2. Métodos Protegidos: Los métodos protegidos solo pueden invocarse con objetos de la clase definitoria y sus subclases. El acceso se mantiene dentro de la familia. Sin embargo, el uso de protegido es limitado.
3. Métodos Privados: Los métodos privados no se pueden llamar con un receptor explícito, el receptor es siempre uno mismo. Esto significa que los métodos privados solo se pueden llamar en el contexto del objeto actual; No puedes invocar los métodos privados de otro objeto.
En el ejemplo de protected, no entendi cual es el objetivo “práctico” de ponerlo en un accesor, me encontre algo mas entendible de como usarlo, primero expongo el problema:
classCharacter def initialize description, genre, tools
@description = description
@genre = genre
@tools = tools
end
protectedattr_accessor:description,:genre,:tools
end
p1 =Character.new('Mi personaje es alto y robusto','Masculino',['pluma','computadora'])p1.description
description no es accesible ya que es protegido.
Declarar un método protegido significa que el método/propiedades protegidas no podrán ser accesibles por una instancia directa de la clase, pero, dentro de la clase que tiene el método/propiedad protegido, si se le envía un objeto (creado a partir de dicha clase) a otra instancia de la clase, si puede acceder al método/propiedad:
classB def initialize foo
@foo = foo
end
def <=>(other) @foo <=> other.foo end
protectedattr_accessor:foo
end
ejemplo =B.new2ejemplo2 =B.new2#La propiedad esta protegida
ejemplo.foo#Pero al usar una instancia de esta clase dentro de otra instancia, si puedo accederlo.ejemplo<=> ejemplo2
Fue un ejemplo que me encontre:
No lo había visto en rails xD, a lo mejor en otros videos profundiza sobre protected, solo que aquí no me quedo muy claro.
Acceso a atributos
Las propiedades de un objeto son valores que están asociadas a un objeto
Un objeto es un a colección de propiedades y métodos.
En ruby generalmente las propiedades son llamadas variables de instancia,
en código estas variables se distinguen por llevar un “@” al inicializar
el nombre de la variable ej: @mi_nombre
Variables de instancia son identificadores que le pertenecen al objeto,
no a la clase por eso se llaman de “instancia”
No están disponibles para (leer u modificar) fuera de la definición de la clase
Los métodos accesores funcionan de dos formas, para leer y para escribir; aunque
no se identifican de la forma que se hace en otros programas con "SET/GET"
sino que y en ruby (geters/seters) se ven iguales al nombre de la propiedad y la
forma como se distinguen el uno del otro es que el método accesor “set” que tiene el
operador igual “=”, aunque hay métodos específicos para acceder a estas
funcionalidades «leer y escribir» como (attr_accessor, attr_reader y attr_writer) y el método “attr_accessor” realiza simultáneamente las funciones de escritura y lectura.
consectos extraidos de:
Gracias!
Privado
Un método privado solo puede ser llamado por otro método dentro de la clase en la que se definió (o una de sus subclases).
classKoan def call_say_koan
say_koan
end
private def say_koan
puts "What is the sound of one hand clapping?" end
end
k =Koan.newk.say_koan # Output:NoMethodError:private method `say_koan' called for #<Koan:0x000000021e7380>k.call_say_koan # Output:What is the sound of one hand clapping?
Protegido
Para definir un método protegido, usamos la palabra clave protegida (que en realidad es un método). Al igual que los métodos privados, los métodos protegidos también pueden invocarse mediante otros métodos dentro de la clase en la que se definió (o una de sus subclases). La diferencia es que los métodos protegidos también pueden llamarse desde otras instancias de la misma clase.
classMeditator def initialize(hours) @hours = hours
end
def more_experienced?(other_person) hours > other_person.hours end
protectedattr_reader:hours # We have made the accessor protectedend
m1 =Meditator.new3000m2 =Meditator.new5000m2.more_experienced? m1 # Output:=>truem1.more_experienced? m2 # Output:=>false
Gracias!
bregin - rescue viene siendo como el try - catch en js?