Clases Particulares en Ruby

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
Producción:

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.

Publicación traducida automáticamente

Artículo escrito por Tejashwi5 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *