Entenda a visibilidade do Ruby

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, protectede 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