Ruby | Access Control - GeeksforGeeks

04 Sep, 2018
Access control is a very important part of the object-oriented programming language which is used to restrict the visibility of methods and member fields to protect data from the accidental modification. In terms of access control, Ruby is different from all other Object Oriented Programming languages.
Important Points about Ruby Access Control:
The visibility of the class variable and instance is always private.
Access controls are only applicable to methods.
We can’t apply any access control to the instance and the class variables.
The private methods in Ruby can also be inherited just like public and protected methods.
In Ruby, access control work on two conditions:
First, from where the method is called, i.e inside or outside of the class definition.
Second, the self-keyword is included or not. Basically, self-keyword is used to point to the current recipient.
In Ruby, it is not necessary for the inheritance to involve in access control, like in C++ access control are used in inheritance. Access control is of three types as shown in the below image:
Public Methods are those methods which can be called by anyone. As we know that access control works only on methods, so by default all the methods are public. But still, we can define a public method explicitly using the public keyword. Public methods are generally called outside the class.
Example:
# Ruby program to demonstrate # the public access control  #!/usr/bin/ruby  # taking a classclass GeeksforGeeks       # public method without using      # public keyword         def geeks_1         puts "public method geeks_1 is called"     end      # using public keyword    public          def geeks_2         puts "public method geeks_2 is called"       end            def geeks_3                    puts "public method geeks_3 is called"                    # calling geeks_1 method         geeks_1                    # calling geeks_1 method using         # self-keyword         self.geeks_1     end          end  # creating the object of # class GeeksforGeeksobj = GeeksforGeeks.new  # calling method geeks_1obj.geeks_1  # calling method geeks_2obj.geeks_2  # calling method geeks3obj.geeks_3
Output:
public method geeks_1 is called
public method geeks_2 is called
public method geeks_3 is called
public method geeks_1 is called
public method geeks_1 is called

Private methods are those methods which are not accessible outside the class or in other words, private methods are called only inside the class definition. The methods of the class can access private members. In private methods, we do not use the self-keyword. By default, initialize method will be private method. The user cannot make the initialize method as the public method. A private method is defined by using private keyword.
Note: As we know that private methods are strictly restricted for their visibility, only defined class members can access these methods, but they can be inherited by the subclass. A subclass can access them and can override them.
Example:
# Ruby program to demonstrate # the private access control  #!/usr/bin/ruby  # creating classclass GeeksforGeeks           # using initialize method    # it can't be private    def initialize        puts "This is the initialize Method"     end          # public method    def geeks_1                       puts "Public geeks_1 Method"         end          # using the private keyword to     # declare a private method    private           def geeks_2                    puts "This is Private Method"       end        end            # creating the object of # the class GeeksforGeeksobj = GeeksforGeeks.new  # calling method geeks_1# (geeks1 method is public method)obj.geeks_1  # calling private method will give the errorobj.geeks_2
Error:
source_file.rb:41:in `
This is the initialize MethodPublic geeks_1 Method
Protected methods can only be called by objects of the defined class and its subclass. The access of these methods is limited in between the defined class or its subclass. You cannot access protected methods outside the defined class or its subclass. The usage of protected methods is finite. Protected methods are defined using protected keyword.
Example:
# Ruby program to demonstrate # the protected access control  #!/usr/bin/ruby  class GeeksforGeeks        # using initialize method    def initialize                  # calling geeks_2 method        geeks_2                  # calling geeks_2 method         # using self-keyword        self.geeks_2               end          # public method    def geeks_1         puts " geeks_1 method is called"       end           # defining the protected method using    # protected keyword    protected          def geeks_2         puts " geeks_2 method is called"      end  end  # creating the object of class GeeksforGeeksobj = GeeksforGeeks.new  # calling methodobj.geeks_1    # if you will try to call protected method # using the object of class then it will # give errorobj.geeks_2
Error:
source_file.rb:45:in `
geeks_2 method is calledgeeks_2 method is calledgeeks_1 method is called
Note:
The user can call the private and protected methods inside a public method of the same class.Example:# Ruby program to demonstrate the calling # of private and protected method in the # public method  class Geeks       # public method    def method_1         p "Public Method of class Geeks"               # calling protected and private method        # inside the public method        method_2        method_3    end       # defining the protected method    protected       def method_2                  p "Protected Method of class Geeks"     end       # defining the private method       private       def method_3                 p "Private Method of class Geeks"               endend   # creating an object of class Geeksobj = Geeks.new  # calling the public method of class Geeksobj.method_1Output:"Public Method of class Geeks"
"Protected Method of class Geeks"
"Private Method of class Geeks"

Example:
# Ruby program to demonstrate the calling # of private and protected method in the # public method  class Geeks       # public method    def method_1         p "Public Method of class Geeks"               # calling protected and private method        # inside the public method        method_2        method_3    end       # defining the protected method    protected       def method_2                  p "Protected Method of class Geeks"     end       # defining the private method       private       def method_3                 p "Private Method of class Geeks"               endend   # creating an object of class Geeksobj = Geeks.new  # calling the public method of class Geeksobj.method_1
Output:
"Public Method of class Geeks"
"Protected Method of class Geeks"
"Private Method of class Geeks"

In general, private methods can’t be inherited in object-oriented programming languages. But in Ruby, private methods can also be inherited just like protected and public methods.Example:# Ruby program to demonstrate that private  # method can also be inherited  class Geeks       # public method    def method_1            p "Public Method of class Geeks"         end       # defining the protected method    protected       def method_2                  p "Protected Method of class Geeks"     end       # defining the private method       private       def method_3                  p "Private Method of class Geeks"               endend  # Sudo class inheriting Geeks classclass Sudo < Geeks         # public method of Sudo class    def method_4                  p "Public Method of Sudo Class"                  # calling all three methods         # of Geeks class        method_1        method_2        method_3    endend   # creating an object of class Sudoobj_sudo = Sudo.new  # calling the public method# of class Sudo which will# automatically call the private # and protected method of Geeks classobj_sudo.method_4Output:"Public Method of Sudo Class"
"Public Method of class Geeks"
"Protected Method of class Geeks"
"Private Method of class Geeks"

Example:
# Ruby program to demonstrate that private  # method can also be inherited  class Geeks       # public method    def method_1            p "Public Method of class Geeks"         end       # defining the protected method    protected       def method_2                  p "Protected Method of class Geeks"     end       # defining the private method       private       def method_3                  p "Private Method of class Geeks"               endend  # Sudo class inheriting Geeks classclass Sudo < Geeks         # public method of Sudo class    def method_4                  p "Public Method of Sudo Class"                  # calling all three methods         # of Geeks class        method_1        method_2        method_3    endend   # creating an object of class Sudoobj_sudo = Sudo.new  # calling the public method# of class Sudo which will# automatically call the private # and protected method of Geeks classobj_sudo.method_4
Output:
"Public Method of Sudo Class"
"Public Method of class Geeks"
"Protected Method of class Geeks"
"Private Method of class Geeks"

The public method can be accessed outside the class in which they are defined. But user can’t access the private and protected methods outside the class in which they were defined.Example:# Ruby program to demonstrate that private  # and protected method can't be accessed # outside the class even after inheritance  class Geeks       # public method    def method_1            p "Public Method of class Geeks"         end       # defining the protected method    protected       def method_2                  p "Protected Method of class Geeks"     end       # defining the private method       private       def method_3                  p "Private Method of class Geeks"               endend  # Sudo class inheriting Geeks classclass Sudo < Geeks         # public method of Sudo class    def method_4                  p "Public Method of Sudo Class"              endend   # creating an object of class Sudoobj_sudo = Sudo.new  # calling the public method# of class Sudo and Geeksobj_sudo.method_4obj_sudo.method_1  # if you will try to call the protected# and private method using the object # of class Sudo, then it will give errorobj_sudo.method_2obj_sudo.method_3Error:source_file.rb:54:in `‘: protected method `method_2’ called for # (NoMethodError)Did you mean? methodmethod_1method_4methods“Public Method of Sudo Class”“Public Method of class Geeks”
Example:
# Ruby program to demonstrate that private  # and protected method can't be accessed # outside the class even after inheritance  class Geeks       # public method    def method_1            p "Public Method of class Geeks"         end       # defining the protected method    protected       def method_2                  p "Protected Method of class Geeks"     end       # defining the private method       private       def method_3                  p "Private Method of class Geeks"               endend  # Sudo class inheriting Geeks classclass Sudo < Geeks         # public method of Sudo class    def method_4                  p "Public Method of Sudo Class"              endend   # creating an object of class Sudoobj_sudo = Sudo.new  # calling the public method# of class Sudo and Geeksobj_sudo.method_4obj_sudo.method_1  # if you will try to call the protected# and private method using the object # of class Sudo, then it will give errorobj_sudo.method_2obj_sudo.method_3
Error:
source_file.rb:54:in `
“Public Method of Sudo Class”“Public Method of class Geeks”
The main difference between the protected and private methods is that protected methods are accessible from inside the class by using an explicit receiver while private methods are not.Example:# Ruby program to demonstrate that private  # and protected method can't be accessed # outside the class even after inheritance  class Geeks       # public method    def method_1            p "Public Method of class Geeks"         end       # defining the protected method    protected       def method_2                  p "Protected Method of class Geeks"     end       # defining the private method       private       def method_3                  p "Private Method of class Geeks"               endend  # Sudo class inheriting Geeks classclass Sudo < Geeks         # public method of Sudo class    def method_4                  p "Public Method of Sudo Class"                              # calling the public method         # of Geeks class        method_1          # creating object of class Sudo        # inside the public method of         # class Sudo        obj_inside_sudo = Sudo.new          # calling the protected          # method of class Geeks        obj_inside_sudo.method_2                  # calling the private          # method of class Geeks        # using an explicit receiver        obj_inside_sudo.method_3 rescue p "You can't Access!"                        endend       # creating an object of class Sudoobj_sudo = Sudo.new  # calling the public method# of class Sudo obj_sudo.method_4Output:"Public Method of Sudo Class"
"Public Method of class Geeks"
"Protected Method of class Geeks"
"You can't Access!"

Example:
# Ruby program to demonstrate that private  # and protected method can't be accessed # outside the class even after inheritance  class Geeks       # public method    def method_1            p "Public Method of class Geeks"         end       # defining the protected method    protected       def method_2                  p "Protected Method of class Geeks"     end       # defining the private method       private       def method_3                  p "Private Method of class Geeks"               endend  # Sudo class inheriting Geeks classclass Sudo < Geeks         # public method of Sudo class    def method_4                  p "Public Method of Sudo Class"                              # calling the public method         # of Geeks class        method_1          # creating object of class Sudo        # inside the public method of         # class Sudo        obj_inside_sudo = Sudo.new          # calling the protected          # method of class Geeks        obj_inside_sudo.method_2                  # calling the private          # method of class Geeks        # using an explicit receiver        obj_inside_sudo.method_3 rescue p "You can't Access!"                        endend       # creating an object of class Sudoobj_sudo = Sudo.new  # calling the public method# of class Sudo obj_sudo.method_4
Output:
"Public Method of Sudo Class"
"Public Method of class Geeks"
"Protected Method of class Geeks"
"You can't Access!"

To define multiple protected and private methods in a single class, you can use the following syntax:class class_name

  # this method is public 
  def public_method        
  end  

  public :method_1
  
  protected :method_2, :method_3
  
  private :method_4, :method_5  

end  

class class_name

  # this method is public 
  def public_method        
  end  

  public :method_1
  
  protected :method_2, :method_3
  
  private :method_4, :method_5  

end  

Ruby-OOP
Ruby
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Ruby | Enumerator each_with_index function
How to Make a Custom Array of Hashes in Ruby?
Ruby | Decision Making (if, if-else, if-else-if, ternary) | Set - 1
Ruby | String concat Method
Ruby | pop() function
Ruby For Beginners
Ruby | String empty? Method
Ruby | Enumerable sum() function
Ruby on Rails Introduction
Ruby | Array shift() function