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.
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.
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
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 #
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.
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