¿Qué es un método privado en Ruby?
Es un tipo de método que SOLO se puede llamar desde dentro de la clase donde está definido.
Esto le permite controlar el acceso a sus métodos.
Un método Ruby puede ser:
- privado
- público (predeterminado)
- protegido
De forma predeterminada, TODOS los métodos son public
.
¡Cualquiera puede usarlos!
Pero puede cambiar esto, haciendo un método private
o protected
.
¿por Qué es útil?
Porque puede hacer que estos métodos sean más fáciles de cambiar.
Imagine que está escribiendo una biblioteca de código que se va a usar en algunos proyectos diferentes en el trabajo.
Cuando estos proyectos implementen su biblioteca, llamarán a métodos en las clases que ha creado.
Ahora:
de liberar una nueva versión…
Pero decidieron cambiar el nombre de un public
método.
¡Eso producirá errores en cada proyecto que use este método!
Recuerde esto:
Al tener MENOS métodos públicos, AUMENTA la libertad de cambio dentro de su clase.
¡Veamos algunos ejemplos de código!
Comprender los métodos privados en Ruby
¿Alguna vez ha visto el mensaje de error «método privado llamado»?
Este:
self.puts 123# NoMethodError: private method `puts' called
Entonces ha intentado usar un método private
incorrectamente.
Solo puede usar un método privado por sí mismo.
Ejemplo:
puts 123
Es el mismo método, pero hay que llamarlo así.
Los métodos privados siempre se llaman dentro del contexto de self
.
En otras palabras
Solo puede usar métodos privados con:
- Otros métodos de la misma clase
- Métodos heredados de la clase padre
- Métodos incluidos desde un módulo
Esto significa que no puede llamar a métodos privados desde fuera de la clase que los define.
Porque eso requeriría un «receptor explícito».
A menos que…
Use un método como send
para omitir esta regla.
send(:puts, "apple")
¿Cómo se define un método private
?
def bacon "private bacon"endprivate :bacon
La palabra private
en sí no es una palabra clave, es un método definido en el módulo Kernel
.
Dónde colocar los Métodos Privados
Es normal que una clase tenga más de un método privado.
¿Dónde se colocan estos métodos?
Haga esto:
class Food def public_method end private def bacon end def orange end def coconut endend
Cada método de instancia después de private
se convierte en un método privado.
Puede usar
private_class_method :method_name
si desea definir un método de clase como privado
Es un patrón común definir primero todos sus métodos públicos, luego definir sus métodos private
juntos al final de la clase.
Métodos públicos
Público es la visibilidad de método predeterminada en Ruby.
Este es un ejemplo:
def orange "Vitamin C"end
Si tienes un objeto food
que define orange
, puedes llamarlo así:
food.orange
Si un método se ha hecho privado o protegido, puede volver a hacerlo público.
public :orange
¿Qué es Un Método Protegido?
Los métodos protegidos son menos comunes.
Son como métodos private
, pero puede llamarlos en un objeto & no solo directamente.
Si prueba este ejemplo con private, obtendrá un error:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food
Obtienes el error porque name
sería privado, por lo que no puedes hacer other.name
.
Pero con protected
¡este código funciona!
Métodos privados vs Protegidos
Esa es la diferencia, el hecho de que protected
mantiene el método private
, pero también le permite llamar a ese método en un objeto.
Con privado solo puedes hacer name
, con protegido puedes hacer object.name
.
¿Cuándo debe usar protected?
Solo si tiene un caso muy específico, como el método equals (==
).
La documentación de Ruby recomienda usar private
en lugar de protected
siempre que sea posible.
Y hay esta nota:
«Un método protegido es lento porque no puede usar caché en línea.»
Tenía curiosidad por esto, así que corrí algunos puntos de referencia:
public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s
Esa es una diferencia del 8,5% en el rendimiento.
Tutorial en vídeo
Resumen
Ha aprendido sobre los métodos protegidos de visibilidad, públicos y privados del método Ruby &. Estas no son palabras clave Ruby, son métodos definidos en la clase Module
.