Private Classes in Ruby


The concept of private, protected and public methods in Ruby is a bit different than it other languages like Java.
In Ruby, it is all about which class the person is calling, as classes are objects in ruby.

Private Class

When a constant is declared private in Ruby, it means this constant can never be called with an explicit receiver, a private constant will be called only with an implicit receiver. So, in ruby privates classes can be defined inside a class as a sub-class and declaring them into privates constants, here this private class can be only accessed through the outer-class.
Syntax:

 private_constant: class

Below is the example of Public class:



filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


Output:

I am Iron-man
Legendary outlaw

In the above example as the sub-classes Guardians and Avengers are public, both implicit and explicit users have access to it.

  • Check out the private class
    Example :

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    # 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

    chevron_right

    
    

    Output:

    I am Iron-man
    main.rb:20:in `': private constant Marvel::Guardians referenced (NameError)
    

    So, here if we look at the code they aren’t any access-specifier keywords to make a class as private or public, but they do exist in Ruby, but cannot deal with classes. To make a class as private we need to take the help of private_constant, here this makes any object, class or method as private which will be unavailable to access for explicit users.

  • how can a private class can be accessed through the outer-class.
    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    # 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

    chevron_right

    
    

    Output:

    I am Groot
    I am Iron-man
    main.rb:26:in `': private constant Marvel::Avengers referenced (NameError)
    

    The only way to access the private class(inner-class) is by its outer-class. And private classes can only exist in the form of inner-class only. As we can see in the above code we accessed Groot and Tony (private class methods) with fury (outer class method), by creating Guardians.new and Avengers.new (private class objects) and calling the respective methods with the respective objects Guardians.new.Groot and Avengers.new.Tony (calling the methods) from fury (outer-class method).if the outer-class is private it will be inaccessible for both implicit and explicit users. Because creating an object for private class outside its class is not possible. Therefore no access.

Note :Outer-class can never be private.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.