Self

Em cada ponto em que seu programa está rodando, há um único self – o objeto atual ou padrão acessível para você em seu programa. Você pode dizer qual objeto self representa seguindo um pequeno conjunto de regras.

Contexto de nível superior

O contexto de nível superior é aquele que ocorre antes de você entrar em qualquer outro contexto, como uma definição de classe. Então o termo nível superior se refere ao código escrito externamente a uma classe ou módulo. Se você abrir um novo arquivo de texto e digitar:

1   x = 1

Você criou uma variável local de nível superior. Se você digitar:

1   def m
2   end

Você terá criado um método de nível superior – um método de instância de Object (embora self não seja um Object). Métodos de nível superior são sempre privados. O Ruby lhe provê um self inicial no nível mais alto. Se digitar:

1   puts self

Ele mostrará main (principal) – um termo especial que o objeto self usa para referir-se a si mesmo. A classe do objeto main é Object.

Self dentro de definições de classes e módulos

Em uma definição de classe ou módulo, self é o objeto da classe ou do módulo.

 1   # p063xself1.rb
 2   class S
 3     puts 'Acabei de começar a classe S'
 4     puts self
 5     module M
 6       puts 'Módulo aninhado S::M'
 7       puts self
 8     end
 9     puts 'De volta ao nível externo de S'
10     puts self
11   end

A saída é:

1   >ruby p063xself1.rb
2   Acabei de começar a classe S
3   S
4   Módulo aninhado S::M
5   S::M
6   De volta ao nível externo de S
7   S
8   >Exit code: 0

Self na definição de métodos de instância

Quando a definição de um método é executada, o máximo que você pode dizer é que self dentro deste método será algum objeto futuro que tem acesso ao mesmo.

 1   # p063xself2.rb
 2   class S
 3     def m
 4       puts 'Classe S método m:'
 5       puts self
 6     end
 7   end
 8   s = S.new
 9   s.m

A saída será:

1   >ruby p063xself2.rb
2   Classe S método m:
3   #<S:0x2835908>
4   >Exit code: 0

A saída # é o jeito do Ruby de dizer “uma instância de S”.

Self em um método singleton e em definições de métodos de classe

Métodos singleton – aqueles que estão associados a um objeto e que podem ser chamados apenas por esse objeto. Quando um método singleton é executado, self é o objeto que é o dono do método, como mostrado abaixo:

 1   # p063xself3.rb
 2   obj = Object.new
 3   def obj.show
 4     print 'Sou um objeto: '
 5     puts "aqui self está dentro de um método singleton que me pertence:"
 6     puts self
 7   end
 8   obj.show
 9   print 'E inspecionando o objeto por fora, '
10   puts "para ter certeza que é o mesmo objeto:"
11   puts obj

A saída do exemplo acima é:

1   >ruby p063xself3.rb
2   Sou um objeto: aqui self está dentro de um método singleton que me pertence:
3   #<Object:0x2835688>
4   E inspecionando o objeto por fora, para ter certeza que é o mesmo objeto:
5   #<Object:0x2835688>
6   >Exit code: 0

Métodos de classe são definidos como métodos singleton para objetos do tipo classe. Veja o seguinte programa:

1   # p063xself4.rb
2   class S
3     def S.x
4       puts "Método de classe da classe S"
5       puts self
6     end
7   end
8   S.x

A saída é:

1   >ruby p063xself4.rb
2   Método de classe da classe S
3   S
4   >Exit code: 0

self dentro de um método singleton (um método de classe, nesse caso) é o objeto que possui o método singleton.

Logo do Guru-SP

Este material tem como base o tutorial do RubyLearning.com de Satish Talim e foi traduzido por membros do GURU-SP com a permissão do autor.

Ajude o RubyLearning participando em algum dos cursos pagos ou fazendo uma doação para o projeto

Voltar para o índice