Understand Ruby Visibility
A part of Ruby that has come back to bite many developers (and even worse those that are not writing tests (for shame)) is its handling of visibility- public
, protected
and private
. So I wanted to break it down a bit with a concrete example (Ruby 2.1.2)-
class Person
def apublic
puts "I am public"
end
def instance_check_protected(i)
i.aprotected
end
def instance_check_private(i)
i.aprivate
end
def call_protected_self
self.aprotected
end
def implicit_protected
aprotected
end
def call_private_self
self.aprivate
end
def implicit_private
aprivate
end
protected def aprotected
puts "I am protected"
end
private def aprivate
puts "I am private"
end
end
Now our class is all set up, let's try it out.
p = Person.new
p.apublic # I am public
p.aprotected # protected method `aprotected' called for #<Person:0x007ffafaa175f0> (NoMethodError)
p.aprivate # private method `aprivate' called for #<Person:0x007fec208ef670> (NoMethodError)
p.send(:aprotected) # I am protected
p.method(:aprotected).call # I am protected
p.send(:aprivate) # I am private
p.method(:aprivate).call # I am private
p.call_protected_self # I am protected
p.implicit_protected # I am protected
p.instance_check_protected(Person.new) # I am protected
p.instance_check_private(Person.new) # private method `aprivate' called for #<Person:0x007fbf98a2f2d8> (NoMethodError)
p.call_private_self # private method `aprivate' called for #<Person:0x007f8d6a8976b0> (NoMethodError)
p.implicit_private # I am private
Written by Brandon Hansen
Related protips
Have a fresh tip? Share with Coderwall community!
Post
Post a tip
Best
#Ruby
Authors
Sponsored by #native_company# — Learn More
#native_title#
#native_desc#