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 Method
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:
class GeeksforGeeks
def geeks_1
puts "public method geeks_1 is called"
end
public
def geeks_2
puts "public method geeks_2 is called"
end
def geeks_3
puts "public method geeks_3 is called"
geeks_1
self .geeks_1
end
end
obj = GeeksforGeeks. new
obj.geeks_1
obj.geeks_2
obj.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 Method
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:
class GeeksforGeeks
def initialize
puts "This is the initialize Method"
end
def geeks_1
puts "Public geeks_1 Method"
end
private
def geeks_2
puts "This is Private Method"
end
end
obj = GeeksforGeeks. new
obj.geeks_1
obj.geeks_2
|
Error:
source_file.rb:41:in `‘: private method `geeks_2’ called for # (NoMethodError)
Did you mean? geeks_1
This is the initialize Method
Public geeks_1 Method
Protected 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:
class GeeksforGeeks
def initialize
geeks_2
self .geeks_2
end
def geeks_1
puts " geeks_1 method is called"
end
protected
def geeks_2
puts " geeks_2 method is called"
end
end
obj = GeeksforGeeks. new
obj.geeks_1
obj.geeks_2
|
Error:
source_file.rb:45:in `‘: protected method `geeks_2’ called for # (NoMethodError)
Did you mean? geeks_1
geeks_2 method is called
geeks_2 method is called
geeks_1 method is called
Note:
- The user can call the private and protected methods inside a public method of the same class.
Example:
class Geeks
def method_1
p "Public Method of class Geeks"
method_2
method_3
end
protected
def method_2
p "Protected Method of class Geeks"
end
private
def method_3
p "Private Method of class Geeks"
end
end
obj = Geeks. new
obj.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:
class Geeks
def method_1
p "Public Method of class Geeks"
end
protected
def method_2
p "Protected Method of class Geeks"
end
private
def method_3
p "Private Method of class Geeks"
end
end
class Sudo < Geeks
def method_4
p "Public Method of Sudo Class"
method_1
method_2
method_3
end
end
obj_sudo = Sudo. new
obj_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:
class Geeks
def method_1
p "Public Method of class Geeks"
end
protected
def method_2
p "Protected Method of class Geeks"
end
private
def method_3
p "Private Method of class Geeks"
end
end
class Sudo < Geeks
def method_4
p "Public Method of Sudo Class"
end
end
obj_sudo = Sudo. new
obj_sudo.method_4
obj_sudo.method_1
obj_sudo.method_2
obj_sudo.method_3
|
Error:
source_file.rb:54:in `‘: protected method `method_2’ called for # (NoMethodError)
Did you mean? method
method_1
method_4
methods
“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:
class Geeks
def method_1
p "Public Method of class Geeks"
end
protected
def method_2
p "Protected Method of class Geeks"
end
private
def method_3
p "Private Method of class Geeks"
end
end
class Sudo < Geeks
def method_4
p "Public Method of Sudo Class"
method_1
obj_inside_sudo = Sudo. new
obj_inside_sudo.method_2
obj_inside_sudo.method_3 rescue p "You can't Access!"
end
end
obj_sudo = Sudo. new
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
Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape,
GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out -
check it out now!
Last Updated :
04 Sep, 2018
Like Article
Save Article