El concepto de métodos privados, protegidos y públicos en Ruby es un poco diferente al de otros lenguajes como Java.
En Ruby, todo se trata de a qué clase llama la persona, ya que las clases son objetos en Ruby.
Clase privada
Cuando una constante se declara privada en Ruby, significa que esta constante nunca se puede llamar con un receptor explícito, una constante privada se llamará solo con un receptor implícito. Entonces, en Ruby, las clases privadas se pueden definir dentro de una clase como una subclase y declararlas en constantes privadas, aquí solo se puede acceder a esta clase privada a través de la clase externa.
Sintaxis:
private_constant: class
A continuación se muestra el ejemplo de la clase Public:
# by default public class Marvel # by default public class Guardians def Quill puts "Legendary outlaw" end def Groot puts "I am Groot" end end # by default public class Avengers def Tony puts "I am Iron-man" end end end Marvel::Avengers.new.Tony Marvel::Guardians.new.Quill
I am Iron-man Legendary outlaw
En el ejemplo anterior, como las subclases Guardianes y Vengadores son públicas, tanto los usuarios implícitos como los explícitos tienen acceso a ellas.
- Echa un vistazo a la clase privada
Ejemplo:# Ruby program of accessing private class
# public
class
Marvel
# Private
class
Guardians
def
Quill
puts
"Legendary outlaw"
end
def
Groot
puts
"I am Groot"
end
end
# public
class
Avengers
def
Tony
puts
"I am Iron-man"
end
end
# making Guardians class private
private_constant :Guardians
end
Marvel::Avengers.
new
.Tony
# throws an error(NameError)
Marvel::Guardians.
new
.Quill
Producción:I am Iron-man main.rb:20:in `': private constant Marvel::Guardians referenced (NameError)
Entonces, aquí, si miramos el código, no son palabras clave de especificación de acceso para hacer que una clase sea privada o pública, pero existen en Ruby, pero no pueden tratar con clases. Para hacer que una clase sea privada, necesitamos la ayuda de private_constant , aquí esto hace que cualquier objeto, clase o método sea privado y no estará disponible para el acceso de usuarios explícitos.
- ¿Cómo se puede acceder a una clase privada a través de la clase externa?
# Ruby program a private class accessed through the outer-class.
# public
class
Marvel
# private
class
Guardians
def
Quill
puts
"Legendary outlaw"
end
def
Groot
puts
"I am Groot"
end
end
# private
class
Avengers
def
Tony
puts
"I am Iron-man"
end
end
# outer-class method accessing private classes
def
fury
Guardians.
new
.Groot
Avengers.
new
.Tony
end
private_constant :Guardians
private_constant :Avengers
end
# calls fury method in Marvel call.
Marvel.
new
.fury
# throws error as it is explicit accessing.
Marvel::Avengers.
new
.Tony
# throws error as it is explicit accessing.
Marvel::Guardians.
new
.Quill
Producción:I am Groot I am Iron-man main.rb:26:in `': private constant Marvel::Avengers referenced (NameError)
La única forma de acceder a la clase privada (clase interna) es mediante su clase externa. Y las clases privadas solo pueden existir en forma de clase interna. Como podemos ver en el código anterior, accedimos a Groot y Tony (métodos de clase privada) con furia (método de clase externa), creando Guardians.new y Avengers.new (objetos de clase privada) y llamando a los métodos respectivos con los objetos respectivos Guardianes .new.Groot y Avengers.new.Tony (llamando a los métodos) de fury (método de clase externa). Si la clase externa es privada, será inaccesible tanto para los usuarios implícitos como para los explícitos. Porque no es posible crear un objeto para una clase privada fuera de su clase. Por lo tanto no hay acceso.
Nota: la clase externa nunca puede ser privada.