A parte de Ruby que voltou a morder muitos desenvolvedores (e pior ainda aqueles que não estão escrevendo testes (de vergonha)) é a sua manipulação de visibility- public
, protected
e private
. Então, eu queria dividir um pouco com um exemplo concreto (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
Agora que nossa aula está configurada, vamos experimentar.
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