What is a private method in Ruby?
é um tipo de método que você só pode chamar de dentro da classe onde está definido.
Isto permite-lhe controlar o acesso aos seus métodos.
Um método Ruby pode ser:
- private
 - público (padrão)
 - protegidas
 
Por padrão, TODOS os métodos são public.
qualquer um pode usá-los!
Mas você pode mudar isso, fazendo um método private ou protected.
porque é que isto é útil?
porque pode facilitar a mudança destes métodos.Imagine que está a escrever uma biblioteca de códigos que vai ser usada em alguns projectos diferentes no trabalho.Quando esses projetos implementarem sua biblioteca, eles vão chamar os métodos das classes que você criou.
Now:
you release a new version …
 But you decided to change the name on a public method.
isso vai produzir erros em todos os projetos que estão usando este método!
lembre-se disto:Ao ter menos métodos públicos, aumenta a liberdade de mudança dentro da sua classe.
vamos ver alguns exemplos de código!
Understanding Private Methods in Ruby
alguma vez viu o “private method called” error message?
este:
self.puts 123# NoMethodError: private method `puts' called
então você tentou usar um método private incorretamente.
só pode utilizar um método privado por si só.
exemplo:
puts 123
é o mesmo método, mas tens de lhe chamar assim.
os métodos privados são sempre chamados no contexto de self.
Em outras palavras…
Você só pode usar métodos privados com:
- Outros métodos da mesma classe
 - Métodos herdados da classe pai
 - Métodos incluídos a partir de um módulo
 
Isso significa que você não pode chamar métodos privados de fora a classe que os define.
porque isso exigiria um “receptor explícito”.
a menos que…
use um método como send para contornar esta regra.
send(:puts, "apple")
 como define um método private?
def bacon "private bacon"endprivate :bacon
 a palavra private em si não é uma palavra-chave, é um método definido no módulo Kernel.
onde colocar os seus métodos privados
é normal que uma classe tenha mais do que um método privado.
onde você coloca estes métodos?
faça isto:
class Food def public_method end private def bacon end def orange end def coconut endend
cada método de instância após private torna-se um método privado.
pode usar
private_class_method :method_namese quiser definir um método de classe como privado
 é um padrão comum definir todos os seus métodos públicos primeiro, então defina os seus métodos private juntos no final da classe.
Public Methods
Public is the default method visibility in Ruby.
Aqui está um exemplo:
def orange "Vitamin C"end
Se você tem um objeto food que define orange, você pode chamá-lo assim:
food.orange
Se um método tem sido feita privado ou protegido, você pode torná-lo público novamente.O que é um método protegido?Os métodos protegidos são menos comuns.
 eles são como private métodos, mas você pode chamá-los em um objeto & não apenas diretamente.
se tentar este exemplo com o private irá obter um erro:
class Food def initialize(name) @name = name end def ==(other) name == other.name end protected attr_reader :nameendfood = Food.new("chocolate")puts food == food
você recebe o erro porque name seria privado, então você não pode fazer other.name.
 mas com protected este código funciona!
métodos privados vs protegidos
 essa é a diferença, o fato de que protected mantém o método private, mas também permite que você chame esse método em um objeto.
 com Privado só pode fazer name, com protegido pode fazer object.name.
quando deve utilizar o protected?
 apenas se tiver um caso muito específico, como o método de valores iguais (==).
 a documentação em Ruby recomenda a utilização de private em vez de protected sempre que possível.
e há esta nota:
“um método protegido é lento porque não pode usar cache inline.”
eu estava curioso sobre isso, então eu corri alguns benchmarks:
public: 2813891.9 i/sprivate: 2699273.8 i/sprotected: 2572122.0 i/s
Essa é uma diferença de 8,5% no desempenho.
Tutorial Vídeo
resumo
 você aprendeu sobre a visibilidade do método Ruby, públicos, privados & métodos protegidos. Estes não são palavras-chave Ruby, eles são os próprios métodos definidos na classe Module.