forked from guru-sp/tutorial_ruby
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathduck-typing.html
137 lines (124 loc) · 9.1 KB
/
duck-typing.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
<!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>Duck Typing</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">Duck Typing</p>
<p>Talvez você já tenha notado, que em Ruby não declaramos os tipos de variáveis ou métodos – tudo já é algum tipo de um objeto. Objetos em Ruby (ao contrário dos objetos em outras linguagens orientadas a objeto) podem ser individualmente modificados. Você sempre pode adicionar métodos em um objeto. Em Ruby, o comportamento ou a capacidade de um objeto, pode se diferenciar dos fornecidos pela sua classe.</p>
<div class='box'>
Em Ruby, nós confiamos menos no tipo (ou classe) de um objeto e mais nas suas capacidades. Por isso, Duck Typing (que por ser um termo técnico, não há uma tradução precisa), significa que um tipo de objeto é definido por aquilo que ele pode fazer, não pelo que ele é. Duck Typing refere-se a tendência de Ruby estar menos preocupado com a classe de um objeto e mais preocupado com quais os métodos que podem ser chamados e quais operações podem ser executadas sobre ele. Em Ruby, usaríamos respond_to? ou poderíamos, simplesmente passar um objeto para um método e saberíamos que uma exceção seria levantada, se formos utilizar de forma inadequada.
</div>
<p>Se um objeto anda como um pato e fala como um pato, então o interpretador Ruby está feliz em tratá-lo como se fosse um pato.</p>
<p>Considere o seguinte exemplo.</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="c"># Verificar se o objeto defini o método to_str</span>
<span class="no">2</span> puts (<span class="s"><span class="dl">'</span><span class="k">Uma string</span><span class="dl">'</span></span>.respond_to? <span class="sy">:to_str</span>) <span class="c"># => true</span>
<span class="no">3</span> puts (<span class="co">Exception</span>.new.respond_to? <span class="sy">:to_str</span>) <span class="c"># => false</span>
<span class="no">4</span> puts (<span class="i">4</span>.respond_to? <span class="sy">:to_str</span>) <span class="c"># => false</span>
</pre>
</div>
<p>O exemplo acima é o exemplo mais simples da filosofia Ruby de Duck Typing: se um objeto faz “quack” como um pato (ou age como uma string), basta ir em frente e tratá-lo como um pato (ou uma string). Sempre que possível, você deve tratar objetos de acordo com os métodos que ele possui, ao invés, de definir as classes a partir do que eles herdam ou módulos que incluem.</p>
<p>Agora, considere as três seguintes classes – Pato, Ganso e PatoDonald. Programa <strong>p036duck.rb</strong></p>
<h2>Código</h2>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="r">class</span> <span class="cl">Pato</span>
<span class="no"> 2</span> <span class="r">def</span> <span class="fu">quack</span>
<span class="no"> 3</span> <span class="s"><span class="dl">'</span><span class="k">Quack!</span><span class="dl">'</span></span>
<span class="no"> 4</span> <span class="r">end</span>
<span class="no"> 5</span>
<span class="no"> 6</span> <span class="r">def</span> <span class="fu">nadar</span>
<span class="no"> 7</span> <span class="s"><span class="dl">'</span><span class="k">nadando nadando nadando...</span><span class="dl">'</span></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">class</span> <span class="cl">Ganso</span>
<span class="no">12</span> <span class="r">def</span> <span class="fu">grasnar</span>
<span class="no">13</span> <span class="s"><span class="dl">'</span><span class="k">Grasnando!</span><span class="dl">'</span></span>
<span class="no">14</span> <span class="r">end</span>
<span class="no">15</span>
<span class="no">16</span> <span class="r">def</span> <span class="fu">nadar</span>
<span class="no">17</span> <span class="s"><span class="dl">'</span><span class="k">Splash splash splash...</span><span class="dl">'</span></span>
<span class="no">18</span> <span class="r">end</span>
<span class="no">19</span> <span class="r">end</span>
<span class="no"><strong>20</strong></span>
<span class="no">21</span> <span class="r">class</span> <span class="cl">PatoDonald</span>
<span class="no">22</span> <span class="r">def</span> <span class="fu">quack</span>
<span class="no">23</span> play
<span class="no">24</span> <span class="r">end</span>
<span class="no">25</span>
<span class="no">26</span> <span class="r">def</span> <span class="fu">play</span>
<span class="no">27</span> <span class="s"><span class="dl">'</span><span class="k">Quack! Sou o Pato Donald!</span><span class="dl">'</span></span>
<span class="no">28</span> <span class="r">end</span>
<span class="no">29</span> <span class="r">end</span>
<span class="no"><strong>30</strong></span>
<span class="no">31</span> <span class="r">def</span> <span class="fu">faz_quack</span>(pato)
<span class="no">32</span> pato.quack
<span class="no">33</span> <span class="r">end</span>
<span class="no">34</span> puts faz_quack(<span class="co">Pato</span>.new)
<span class="no">35</span> puts faz_quack(<span class="co">PatoDonald</span>.new)
<span class="no">36</span>
<span class="no">37</span> <span class="r">def</span> <span class="fu">faz_nadar</span>(duck)
<span class="no">38</span> duck.nadar
<span class="no">39</span> <span class="r">end</span>
<span class="no"><strong>40</strong></span> puts faz_nadar(<span class="co">Pato</span>.new)
<span class="no">41</span> puts faz_nadar(<span class="co">Ganso</span>.new)
</pre>
</div>
<p>Se você consultar o código abaixo:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="r">def</span> <span class="fu">faz_quack</span>(pato)
<span class="no">2</span> pato.quack
<span class="no">3</span> <span class="r">end</span>
<span class="no">4</span> puts faz_quack(<span class="co">Pato</span>.new)
<span class="no">5</span> puts faz_quack(<span class="co">PatoDonald</span>.new)
</pre>
</div>
<p>Um método que disse a um Pato para fazer quack funciona quando recebe um PatoDonald, graças ao Duck Typing. O mesmo pode ser observado no seguinte código:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="r">def</span> <span class="fu">faz_nadar</span>(pato)
<span class="no">2</span> pato.nadar
<span class="no">3</span> <span class="r">end</span>
<span class="no">4</span> puts faz_nadar(<span class="co">Pato</span>.new)
<span class="no">5</span> puts faz_nadar(<span class="co">Ganso</span>.new)
</pre>
</div>
<p>Quando um método que diz para um Pato nadar recebe um Ganso, ele funciona.</p>
<div class="pagination"><a href="acucares-sintaticos-do-ruby.html">Açúcares sintáticos do Ruby ></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>