-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathmodulos-mixins.html
192 lines (179 loc) · 13.9 KB
/
modulos-mixins.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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<!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>Módulos e Mixins</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">Módulos e Mixins</p>
<p>Módulos Ruby são similares a classes em relação ao fato de que também armazenam uma coleção de métodos, constantes e outras definições de módulos e classes. Módulos são definidos de forma similar as classes, mas a palavra-chave <b>module</b> é usada no lugar de <b>class</b>. Entretanto, diferente das classes, você não pode criar objetos baseados em módulos nem pode criar módulos que herdam desse módulo; ao invés disso, você especifica qual funcionalidade de um módulo específico você deseja adicionar a uma classe ou a um objeto específico. Módulos permanecem sozinhos; não há hierarquia de módulos ou herança. Módulos são um bom lugar para armazenar constantes em um local centralizado.</p>
<p>Módulos tem dois principais objetivos:</p>
<ul>
<li>Primeiro eles agem como namespace, permitindo que você defina métodos cujos nomes não irão colidir com aqueles definidos em outras partes de um programa. Os exemplos <b>p058mytrig.rb, p059mymoral.rb, p060usemodule.rb</b> mostram isso.</li>
</ul>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p058mytrig.rb</span>
<span class="no"> 2</span> <span class="r">module</span> <span class="cl">Trig</span>
<span class="no"> 3</span> <span class="co">PI</span> = <span class="fl">3.1416</span>
<span class="no"> 4</span> <span class="c"># métodos de classe</span>
<span class="no"> 5</span> <span class="r">def</span> <span class="co">Trig</span>.sin(x)
<span class="no"> 6</span> <span class="c"># ...</span>
<span class="no"> 7</span> <span class="r">end</span>
<span class="no"> 8</span> <span class="r">def</span> <span class="co">Trig</span>.cos(x)
<span class="no"> 9</span> <span class="c"># ...</span>
<span class="no"><strong>10</strong></span> <span class="r">end</span>
<span class="no">11</span> <span class="r">end</span>
<span class="no">12</span>
<span class="no">13</span> <span class="c"># p059mymoral.rb</span>
<span class="no">14</span> <span class="r">module</span> <span class="cl">Moral</span>
<span class="no">15</span> <span class="co">VERY_BAD</span> = <span class="i">0</span>
<span class="no">16</span> <span class="co">BAD</span> = <span class="i">1</span>
<span class="no">17</span> <span class="r">def</span> <span class="co">Moral</span>.sin(badness)
<span class="no">18</span> <span class="c"># ...</span>
<span class="no">19</span> <span class="r">end</span>
<span class="no"><strong>20</strong></span> <span class="r">end</span>
<span class="no">21</span>
<span class="no">22</span> <span class="c"># p060usemodule.rb</span>
<span class="no">23</span> require <span class="s"><span class="dl">'</span><span class="k">p058mytrig</span><span class="dl">'</span></span>
<span class="no">24</span> require <span class="s"><span class="dl">'</span><span class="k">p059mymoral</span><span class="dl">'</span></span>
<span class="no">25</span> <span class="co">Trig</span>.sin(<span class="co">Trig</span>::<span class="co">PI</span>/<span class="i">4</span>)
<span class="no">26</span> <span class="co">Moral</span>.sin(<span class="co">Moral</span>::<span class="co">VERY_BAD</span>)
</pre>
</div>
<ul>
<li>Em segundo lugar, permitem que você compartilhe funcionalidade entre classes – se uma classe “mistura” (mixes in) um módulo (isto é, o inclui), todos os métodos de instância do módulo se tornam disponíveis como se tivessem sido definidos na classe.</li>
</ul>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p061mixins.rb</span>
<span class="no"> 2</span> <span class="r">module</span> <span class="cl">D</span>
<span class="no"> 3</span> <span class="r">def</span> <span class="fu">initialize</span>(nome)
<span class="no"> 4</span> <span class="iv">@nome</span> =nome
<span class="no"> 5</span> <span class="r">end</span>
<span class="no"> 6</span> <span class="r">def</span> <span class="fu">to_s</span>
<span class="no"> 7</span> <span class="iv">@nome</span>
<span class="no"> 8</span> <span class="r">end</span>
<span class="no"> 9</span> <span class="r">end</span>
<span class="no"><strong>10</strong></span>
<span class="no">11</span> <span class="r">module</span> <span class="cl">Debug</span>
<span class="no">12</span> include <span class="co">D</span>
<span class="no">13</span> <span class="c"># Métodos que agem como perguntas</span>
<span class="no">14</span> <span class="c"># geralmente são nomeados com um ? no final</span>
<span class="no">15</span> <span class="r">def</span> <span class="fu">quem_sou_eu?</span>
<span class="no">16</span> <span class="s"><span class="dl">"</span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.class.nome<span class="idl">}</span></span><span class="k"> (</span><span class="ch">\#</span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.object_id<span class="idl">}</span></span><span class="k">): </span><span class="il"><span class="idl">#{</span><span class="pc">self</span>.to_s<span class="idl">}</span></span><span class="dl">"</span></span>
<span class="no">17</span> <span class="r">end</span>
<span class="no">18</span> <span class="r">end</span>
<span class="no">19</span>
<span class="no"><strong>20</strong></span> <span class="r">class</span> <span class="cl">Phonograph</span>
<span class="no">21</span> <span class="c"># a declaração include apenas faz uma referência para o módulo nomeado</span>
<span class="no">22</span> <span class="c"># se esse módulo está em um arquivo separado, use require para adicioná-lo</span>
<span class="no">23</span> <span class="c"># antes de usar o include</span>
<span class="no">24</span> include <span class="co">Debug</span>
<span class="no">25</span> <span class="c"># ...</span>
<span class="no">26</span> <span class="r">end</span>
<span class="no">27</span>
<span class="no">28</span> <span class="r">class</span> <span class="cl">EightTrack</span>
<span class="no">29</span> include <span class="co">Debug</span>
<span class="no"><strong>30</strong></span> <span class="c"># ...</span>
<span class="no">31</span> <span class="r">end</span>
<span class="no">32</span>
<span class="no">33</span> ph = <span class="co">Phonograph</span>.new(<span class="s"><span class="dl">"</span><span class="k">West End Blues</span><span class="dl">"</span></span>)
<span class="no">34</span> et = <span class="co">EightTrack</span>.new(<span class="s"><span class="dl">"</span><span class="k">Real Pillow</span><span class="dl">"</span></span>)
<span class="no">35</span> puts ph.quem_sou_eu?
<span class="no">36</span> puts et.quem_sou_eu?
</pre>
</div>
<div class='box'>
<p>Observe como usamos require ou load. require e load aceitam strings como argumentos.</p>
<p>require ‘motorcycle’ ou load ‘motorcycle.rb’</p>
<p>include recebe o nome de um módulo, na forma de uma constante, como em include Coisa.</p>
<p>O método include aceita qualquer número de módulos para serem inclusos:</p>
<p>include Enumerable, Comparable</p>
<p>Embora toda classe seja um módulo, o método include não permite que uma classe seja incluída em outra classe.</p>
</div>
<p>Mais alguns exemplos:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p062stuff.rb</span>
<span class="no"> 2</span> <span class="c"># Um módulo pode conter constantes, métodos e classes.</span>
<span class="no"> 3</span> <span class="c"># Mas não pode conter instâncias</span>
<span class="no"> 4</span>
<span class="no"> 5</span> <span class="r">module</span> <span class="cl">Coisa</span>
<span class="no"> 6</span> <span class="co">C</span> = <span class="i">10</span>
<span class="no"> 7</span> <span class="r">def</span> <span class="co">Coisa</span>.m(x) <span class="c"># prefixe com o nome do módulo para um método de classe</span>
<span class="no"> 8</span> <span class="co">C</span>*x
<span class="no"> 9</span> <span class="r">end</span>
<span class="no"><strong>10</strong></span> <span class="r">def</span> <span class="fu">p</span>(x) <span class="c"># um método de instância, um mixin para outras classes</span>
<span class="no">11</span> <span class="co">C</span> + x
<span class="no">12</span> <span class="r">end</span>
<span class="no">13</span> <span class="r">class</span> <span class="cl">T</span>
<span class="no">14</span> <span class="iv">@t</span> = <span class="i">2</span>
<span class="no">15</span> <span class="r">end</span>
<span class="no">16</span> <span class="r">end</span>
<span class="no">17</span> puts <span class="co">Coisa</span>::<span class="co">C</span> <span class="c"># namespace Coisa</span>
<span class="no">18</span> puts <span class="co">Coisa</span>.m(<span class="i">3</span>) <span class="c"># como um método de classe</span>
<span class="no">19</span> x = <span class="co">Coisa</span>::<span class="co">T</span>.new
<span class="no"><strong>20</strong></span> <span class="c"># se você tentar o seguinte terá um erro de constante não inicializada</span>
<span class="no">21</span> <span class="c"># puts C</span>
<span class="no">22</span>
<span class="no">23</span> <span class="c">#------------</span>
<span class="no">24</span>
<span class="no">25</span> <span class="c"># p063stuffusage.rb</span>
<span class="no">26</span> require <span class="s"><span class="dl">'</span><span class="k">p062stuff</span><span class="dl">'</span></span> <span class="c"># carrega o módulo Coisa do arquivo p062stuff.rb</span>
<span class="no">27</span> <span class="c"># $: é uma variável de sistema - contém o caminho para carregamento de arquivos</span>
<span class="no">28</span>
<span class="no">29</span> <span class="r">class</span> <span class="cl">D</span>
<span class="no"><strong>30</strong></span> include <span class="co">Coisa</span> <span class="c"># se refere ao módulo carregado</span>
<span class="no">31</span> puts <span class="co">Coisa</span>.m(<span class="i">4</span>)
<span class="no">32</span> <span class="r">end</span>
<span class="no">33</span>
<span class="no">34</span> d = <span class="co">D</span>.new
<span class="no">35</span> puts d.p(<span class="i">5</span>) <span class="c"># método p do módulo Coisa</span>
<span class="no">36</span> puts <span class="gv">$:</span> <span class="c"># array de diretórios para procurar carregamentos</span>
<span class="no">37</span> <span class="gv">$:</span> << <span class="s"><span class="dl">"</span><span class="k">c:/</span><span class="dl">"</span></span> <span class="c"># adicione um diretório ao loadpath</span>
<span class="no">38</span> puts <span class="gv">$:</span>
<span class="no">39</span> puts <span class="co">Coisa</span>.m(<span class="i">5</span>) <span class="c"># método de classe Coisa não chamado pelo objeto D</span>
</pre>
</div>
<div class='box'>
<p>Lembre-se que você pode incluir mais de um módulo em uma classe. Porém, uma classe não pode herdar de mais de uma classe.<br />
Nomes de classe geralmente são substantivos, enquanto nomes de módulos costumam ser adjetivos.</p>
</div>
<div class='box'>
<p>NO RAILS: O Código fonte do Rails usa bastante módulos, em particular a técnica de reabrir o corpo de definição tanto de módulos quanto de classes.</p>
</div>
<div class="pagination"><a href="self.html">Self ></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>