-
Notifications
You must be signed in to change notification settings - Fork 11
/
constantes.html
151 lines (138 loc) · 11 KB
/
constantes.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
<!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>Constantes</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">Constantes</p>
<p>Uma constante Ruby é como uma variável, exceto que seu valor supostamente deve se manter constante enquanto o programa durar. O interpretador Ruby na verdade não força a constância de constantes, mas ele avisa caso um programa altere o valor de uma constante, como mostrado nesse exemplo trivial – <b>p054constwarn.rb</b></p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="c"># p054constwarn.rb</span>
<span class="no">2</span> <span class="co">A_CONST</span> = <span class="i">10</span>
<span class="no">3</span> <span class="co">A_CONST</span> = <span class="i">20</span>
</pre>
</div>
<p>Produz um aviso (warning):</p>
<div class="CodeRay">
<pre><span class="no">1</span> p054constwarn.rb:3: warning: already initialized constant A_CONST
<span class="no">2</span> # aviso: a constante A_CONST já foi inicializada
</pre>
</div>
<p>Do ponto de vista léxico, o nome de constantes se parece com o de variáveis locais, exceto pelo fato de começarem uma letra em maiúsculo. Por convenção, a maioria das constantes são escritas com todas as letras em maiúsculas e underscores são usados para separar palavras, DESSA_FORMA. Os nomes de módulo e de classes Ruby são também constantes, mas são convencionalmente escritos usando letras maiúsculas no início de cada palavra (o chamado camel case), AssimPorExemplo.</p>
<p>Perceba que constantes não existem até que um valor seja associado as mesmas.</p>
<p>Embora constantes não devam ser alteradas, você pode modificar o estado interno dos objetos que elas referenciam, como visto no exemplo <b>p055constalter.rb</b>:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="c"># p055constalter.rb</span>
<span class="no">2</span> <span class="co">A_CONST</span> = <span class="s"><span class="dl">"</span><span class="k">Doshi</span><span class="dl">"</span></span>
<span class="no">3</span> <span class="co">B_CONST</span> = <span class="co">A_CONST</span>
<span class="no">4</span> <span class="co">A_CONST</span>[<span class="i">0</span>] = <span class="s"><span class="dl">"</span><span class="k">J</span><span class="dl">"</span></span> <span class="c"># altera a string referenciada pela constante</span>
<span class="no">5</span> puts <span class="co">A_CONST</span> <span class="c"># mostra Joshi</span>
<span class="no">6</span> puts <span class="co">B_CONST</span> <span class="c"># também mostra Joshi</span>
</pre>
</div>
<div class='box'>
<p>NO RAILS: Você pode encontrar exemplos desse tipo de operação (modificação) no código fonte do Rails, onde constantes aparecem prominentemente e os objetos que elas representam passam por mudanças com certa frequência.</p>
</div>
<p>Observe:</p>
<ul>
<li>Constantes definidas dento de uma classe ou módulo podem ser acessadas em qualquer lugar dentro da classe ou módulo</li>
<li>Fora da classe ou módulo, elas podem ser acessadas usando o operador de escopo :: , prefixado por uma expressão que retorna o módulo ou classe associado (Classe::CONSTANTE)</li>
<li>Constantes definidas fora de qualquer classe ou módulo podem ser acessadas normalmente ou usando o operador de escopo sem nenhum prefixo.</li>
<li>Constantes não podem ser definidas em métodos.</li>
<li>Constantes podem ser externamente adicionadas a classes e módulos existentes utilizando o nome da classe ou do módulo e o operador de escopo antes do nome da constante.</li>
</ul>
<p>O programa <b>p056const.rb</b> mostra tudo isso:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="co">CONSTANTE_EXTERNA</span> = <span class="i">99</span>
<span class="no"> 2</span>
<span class="no"> 3</span> <span class="r">class</span> <span class="cl">Constante</span>
<span class="no"> 4</span> <span class="r">def</span> <span class="fu">pega_constante</span>
<span class="no"> 5</span> <span class="co">CONSTANTE</span>
<span class="no"> 6</span> <span class="r">end</span>
<span class="no"> 7</span> <span class="co">CONSTANTE</span> = <span class="co">CONSTANTE_EXTERNA</span> + <span class="i">1</span>
<span class="no"> 8</span> <span class="r">end</span>
<span class="no"> 9</span>
<span class="no"><strong>10</strong></span> puts <span class="co">Constante</span>.new.pega_constante
<span class="no">11</span> puts <span class="co">Constante</span>::<span class="co">CONSTANTE</span>
<span class="no">12</span> puts ::<span class="co">CONSTANTE_EXTERNA</span>
<span class="no">13</span> puts <span class="co">Constante</span>::<span class="co">NOVA_CONSTANTE</span> = <span class="i">123</span>
</pre>
</div>
<p>Outro exemplo elaborado sobre métodos de uma classe é o <b>p057mymethods2.rb</b>. Nesse exemplo nós também vemos como escrever um método de classe.</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p057mymethods2.rb</span>
<span class="no"> 2</span> <span class="c"># variávais e métodos começam com letra minúscula</span>
<span class="no"> 3</span> <span class="gv">$glob</span> = <span class="i">5</span> <span class="c"># variáveis globais começam com $</span>
<span class="no"> 4</span> <span class="r">class</span> <span class="cl">TestVar</span> <span class="c"># nome de classe é constante, começa com maiúscula</span>
<span class="no"> 5</span> <span class="cv">@@cla</span> = <span class="i">6</span> <span class="c"># variáveis de classe começam com @@</span>
<span class="no"> 6</span> <span class="co">CONST_VAL</span> = <span class="i">7</span> <span class="c"># estilo de constante, caixa alta, underscore</span>
<span class="no"> 7</span> <span class="r">def</span> <span class="fu">initialize</span>(x) <span class="c"># construtor</span>
<span class="no"> 8</span> <span class="iv">@inst</span> = x <span class="c"># variáveis de instância começam com @</span>
<span class="no"> 9</span> <span class="cv">@@cla</span> += <span class="i">1</span> <span class="c"># cada objeto compartilha @@cla</span>
<span class="no"><strong>10</strong></span> <span class="r">end</span>
<span class="no">11</span> <span class="r">def</span> <span class="pc">self</span>.<span class="fu">cla</span> <span class="c"># método de classe, getter</span>
<span class="no">12</span> <span class="cv">@@cla</span>
<span class="no">13</span> <span class="r">end</span>
<span class="no">14</span> <span class="r">def</span> <span class="pc">self</span>.<span class="fu">cla=</span>(y) <span class="c"># método de classe, setter, também TestVar.</span>
<span class="no">15</span> <span class="cv">@@cla</span> = y
<span class="no">16</span> <span class="r">end</span>
<span class="no">17</span> <span class="r">def</span> <span class="fu">inst</span> <span class="c"># método de instância, getter</span>
<span class="no">18</span> <span class="iv">@inst</span>
<span class="no">19</span> <span class="r">end</span>
<span class="no"><strong>20</strong></span> <span class="r">def</span> <span class="fu">inst=</span>(i) <span class="c"># método de instância, setter</span>
<span class="no">21</span> <span class="iv">@inst</span> = i
<span class="no">22</span> <span class="r">end</span>
<span class="no">23</span> <span class="r">end</span>
<span class="no">24</span> puts <span class="gv">$glob</span>
<span class="no">25</span> test = <span class="co">TestVar</span>.new(<span class="i">3</span>) <span class="c"># chama construtor</span>
<span class="no">26</span> puts <span class="co">TestVar</span>.cla <span class="c"># chma getter</span>
<span class="no">27</span> puts test.inspect <span class="c"># dá o ID do objeto e variáveis de instância</span>
<span class="no">28</span> <span class="co">TestVar</span>.cla = <span class="i">4</span> <span class="c"># chama setter</span>
<span class="no">29</span> test.inst=<span class="i">8</span> <span class="c"># chama setter</span>
<span class="no"><strong>30</strong></span> puts <span class="co">TestVar</span>.cla
<span class="no">31</span> puts test.inst <span class="c"># chama getter</span>
<span class="no">32</span> other = <span class="co">TestVar</span>.new(<span class="i">17</span>)
<span class="no">33</span> puts other.inspect
<span class="no">34</span> puts <span class="co">TestVar</span>.cla
</pre>
</div>
<h2>Sumário</h2>
<p>Listei todos os <a href="sumario-ruby8.html">pontos importantes</a> que você precisa se lembrar após ter completado os seguintes tópicos: Serialização de Objetos, Módulos/Mixins, Self e Constantes.</p>
<div class="pagination"><a href="sumario-ruby8.html">Resumo 8 ></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>