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_name
se 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
.