-
Notifications
You must be signed in to change notification settings - Fork 11
/
self.html
175 lines (162 loc) · 9.86 KB
/
self.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en-us">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Self</title>
<meta name="author" content="" />
<!--- Blueprint CSS Framework -->
<link rel="stylesheet" href="css/blueprint/screen.css" type="text/css" media="screen, projection">
<link rel="stylesheet" href="css/blueprint/print.css" type="text/css" media="print">
<!--[if IE]>
<link rel="stylesheet" href="css/blueprint/ie.css" type="text/css" media="screen, projection">
<![endif]-->
<!-- CodeRay syntax highlighting CSS -->
<link rel="stylesheet" href="css/coderay.css" type="text/css" />
<!-- Homepage CSS -->
<link rel="stylesheet" href="css/site.css" type="text/css" media="screen, projection" />
</head>
<body>
<div class="container">
<div class="column span-22 prepend-1 append-1 first last" id="header">
<h1 class="title"><a href="index.html" alt="voltar para o início">Tutorial de Ruby do GURU-SP</a></h1>
<hr>
</div>
<div class="column span-17 prepend-1 first">
<p class="title">Self</p>
<p>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.</p>
<h2>Contexto de nível superior</h2>
<p>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:</p>
<div class="CodeRay">
<pre><span class="no">1</span> x = <span class="i">1</span>
</pre>
</div>
<p>Você criou uma variável local de nível superior. Se você digitar:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="r">def</span> <span class="fu">m</span>
<span class="no">2</span> <span class="r">end</span>
</pre>
</div>
<p>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:</p>
<div class="CodeRay">
<pre><span class="no">1</span> puts <span class="pc">self</span>
</pre>
</div>
<p>Ele mostrará main (principal) – um termo especial que o objeto self usa para referir-se a si mesmo. A classe do objeto main é Object.</p>
<h2>Self dentro de definições de classes e módulos</h2>
<p>Em uma definição de classe ou módulo, self é o objeto da classe ou do módulo.</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p063xself1.rb</span>
<span class="no"> 2</span> <span class="r">class</span> <span class="cl">S</span>
<span class="no"> 3</span> puts <span class="s"><span class="dl">'</span><span class="k">Acabei de começar a classe S</span><span class="dl">'</span></span>
<span class="no"> 4</span> puts <span class="pc">self</span>
<span class="no"> 5</span> <span class="r">module</span> <span class="cl">M</span>
<span class="no"> 6</span> puts <span class="s"><span class="dl">'</span><span class="k">Módulo aninhado S::M</span><span class="dl">'</span></span>
<span class="no"> 7</span> puts <span class="pc">self</span>
<span class="no"> 8</span> <span class="r">end</span>
<span class="no"> 9</span> puts <span class="s"><span class="dl">'</span><span class="k">De volta ao nível externo de S</span><span class="dl">'</span></span>
<span class="no"><strong>10</strong></span> puts <span class="pc">self</span>
<span class="no">11</span> <span class="r">end</span>
</pre>
</div>
<p>A saída é:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p063xself1.rb
<span class="no">2</span> Acabei de começar a classe S
<span class="no">3</span> S
<span class="no">4</span> Módulo aninhado S::M
<span class="no">5</span> S::M
<span class="no">6</span> De volta ao nível externo de S
<span class="no">7</span> S
<span class="no">8</span> >Exit code: 0
</pre>
</div>
<h2>Self na definição de métodos de instância</h2>
<p>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.</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p063xself2.rb</span>
<span class="no"> 2</span> <span class="r">class</span> <span class="cl">S</span>
<span class="no"> 3</span> <span class="r">def</span> <span class="fu">m</span>
<span class="no"> 4</span> puts <span class="s"><span class="dl">'</span><span class="k">Classe S método m:</span><span class="dl">'</span></span>
<span class="no"> 5</span> puts <span class="pc">self</span>
<span class="no"> 6</span> <span class="r">end</span>
<span class="no"> 7</span> <span class="r">end</span>
<span class="no"> 8</span> s = <span class="co">S</span>.new
<span class="no"> 9</span> s.m
</pre>
</div>
<p>A saída será:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p063xself2.rb
<span class="no">2</span> Classe S método m:
<span class="no">3</span> #<S:0x2835908>
<span class="no">4</span> >Exit code: 0
</pre>
</div>
<p>A saída #<S:0x2835908> é o jeito do Ruby de dizer “uma instância de S”.</p>
<h2>Self em um método singleton e em definições de métodos de classe</h2>
<p>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:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p063xself3.rb</span>
<span class="no"> 2</span> obj = <span class="co">Object</span>.new
<span class="no"> 3</span> <span class="r">def</span> obj.show
<span class="no"> 4</span> print <span class="s"><span class="dl">'</span><span class="k">Sou um objeto: </span><span class="dl">'</span></span>
<span class="no"> 5</span> puts <span class="s"><span class="dl">"</span><span class="k">aqui self está dentro de um método singleton que me pertence:</span><span class="dl">"</span></span>
<span class="no"> 6</span> puts <span class="pc">self</span>
<span class="no"> 7</span> <span class="r">end</span>
<span class="no"> 8</span> obj.show
<span class="no"> 9</span> print <span class="s"><span class="dl">'</span><span class="k">E inspecionando o objeto por fora, </span><span class="dl">'</span></span>
<span class="no"><strong>10</strong></span> puts <span class="s"><span class="dl">"</span><span class="k">para ter certeza que é o mesmo objeto:</span><span class="dl">"</span></span>
<span class="no">11</span> puts obj
</pre>
</div>
<p>A saída do exemplo acima é:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p063xself3.rb
<span class="no">2</span> Sou um objeto: aqui self está dentro de um método singleton que me pertence:
<span class="no">3</span> #<Object:0x2835688>
<span class="no">4</span> E inspecionando o objeto por fora, para ter certeza que é o mesmo objeto:
<span class="no">5</span> #<Object:0x2835688>
<span class="no">6</span> >Exit code: 0
</pre>
</div>
<p>Métodos de classe são definidos como métodos singleton para objetos do tipo classe. Veja o seguinte programa:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="c"># p063xself4.rb</span>
<span class="no">2</span> <span class="r">class</span> <span class="cl">S</span>
<span class="no">3</span> <span class="r">def</span> <span class="co">S</span>.x
<span class="no">4</span> puts <span class="s"><span class="dl">"</span><span class="k">Método de classe da classe S</span><span class="dl">"</span></span>
<span class="no">5</span> puts <span class="pc">self</span>
<span class="no">6</span> <span class="r">end</span>
<span class="no">7</span> <span class="r">end</span>
<span class="no">8</span> <span class="co">S</span>.x
</pre>
</div>
<p>A saída é:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p063xself4.rb
<span class="no">2</span> Método de classe da classe S
<span class="no">3</span> S
<span class="no">4</span> >Exit code: 0
</pre>
</div>
<p>self dentro de um método singleton (um método de classe, nesse caso) é o objeto que possui o método singleton.</p>
<div class="pagination"><a href="constantes.html">Constantes ></a></div>
</div>
<div class="column span-5 append-1 last">
<p><a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP"><img src="images/logo_guru-sp.jpg" title="Logo do GURU-SP" alt="Logo do Guru-SP" /></a></p>
<div class="box">
<p>Este material tem como base o <a href="http://www.rubylearning.com" title="Ruby Learning">tutorial do RubyLearning.com de Satish Talim</a> e foi traduzido por membros do <a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP">GURU-SP</a> com a permissão do autor.</p>
<p class="last">Ajude o RubyLearning participando em algum dos <a href="http://www.rubylearning.org" title="cursos do Ruby Learning">cursos pagos</a> ou <a href="http://pledgie.com/campaigns/415" title="Ajude o Ruby Learning">fazendo uma doação para o projeto</a></p>
</div>
<p class="quiet"><a href="index.html" title="índice">Voltar para o índice</a></p>
<h5></h5>
<p class="incr"></p>
</div>
<div class="column span-22 prepend-1 append-1 first last" id="footer">
<hr />
<p>Tuturial de Ruby do <a href="http://www.gurusp.org" title="Grupo de Usuários Ruby de SP">GURU-SP</a>. Este site foi criado com <a href="http://webby.rubyforge.org">Webby</a></p>
</div>
</div>
</body>
</html>