Ruby Private & Protected Methods: Understanding Method Visibility

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.



+