-
Notifications
You must be signed in to change notification settings - Fork 11
/
simbolos.html
157 lines (144 loc) · 10.7 KB
/
simbolos.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
<!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>Símbolos em Ruby (Symbols)</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">Símbolos em Ruby (Symbols)</p>
<p>Um símbolo (<b>Symbol</b>) se parece com um nome de variável mas é prefixado com dois pontos (:). Exemplos: <b>:action</b>, <b>:line_items</b>. Você não precisa pré-declarar um símbolo e garante-se que eles sejam únicos. Não há necessidade de se atribuir algum tipo de valor para um símbolo – Ruby cuida disso para você. A linguagem também garante que não importa onde apareça em seu programa, um símbolo particular terá sempre o mesmo valor.</p>
<p>Alternativamente, você pode considerar que os dois pontos significam “coisa chamada”. Assim, :id é “a coisa chamada id”. Você pode pensar também em :id significando o nome da variável id, e o id (sem os dois pontos) significando o valor da variável.</p>
<div class='box'>
<p>Um símbolo é o objeto Ruby mais básico que você pode criar. Ele é apenas um nome e um ID interno. Símbolos são úteis porque um dado nome de símbolo se refere ao mesmo objeto através de um programa Ruby. Símbolos são mais eficientes que strings. Duas strings com o mesmo conteúdo são dois objetos diferentes, mas para qualquer nome existe apenas um objeto <b>Symbol</b>. Isso pode economizar tempo e memória.</p>
</div>
<p>Veja o exemplo <b>p039symbol.rb</b> abaixo:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="c"># p039symbol.rb</span>
<span class="no">2</span> <span class="c"># use o object_id da classe Object</span>
<span class="no">3</span> <span class="c"># ele retorna um inteiro identificador para um objeto</span>
<span class="no">4</span> puts <span class="s"><span class="dl">"</span><span class="k">string</span><span class="dl">"</span></span>.object_id
<span class="no">5</span> puts <span class="s"><span class="dl">"</span><span class="k">string</span><span class="dl">"</span></span>.object_id
<span class="no">6</span> puts <span class="sy">:symbol</span>.object_id
<span class="no">7</span> puts <span class="sy">:symbol</span>.object_id
</pre>
</div>
<p>A saída quando rodei o programa no meu PC foi:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p039symbol.rb
<span class="no">2</span> 21066960
<span class="no">3</span> 21066930
<span class="no">4</span> 132178
<span class="no">5</span> 132178
<span class="no">6</span> >Exit code: 0
</pre>
</div>
<p>Então, quando usamos uma string e quando usamos um símbolo?</p>
<p>Se o conteúdo (a sequência de caracteres) do objeto é importante, use uma string.<br />
Se a identidade do objeto é importante, use um símbolo.</p>
<div class='box'>
<p>Ruby usa símbolos e mantem uma tabela de símbolos para armazená-los. Símbolos são nomes – nome de variáveis de instância, nomes de métodos, nomes de classes. Então, se existe um método chamado control_movie, existe automaticamente um símbolo <b>:control_movie</b>. Ruby é interpretado, então ele mantem sua tabela de símbolos acessível o tempo todo. Você pode encontrar o que está nela a qualquer momento chamando <b>Symbol.all_symbols</b>.</p>
<p>Um objeto do tipo símbolo é criado prefixando-se um operador, string, variável, constante, método, classe ou módulo como dois pontos. O objeto símbolo será único para cada diferente nome mas não se referirá particularmente a instância do nome, durante a execução do programa. Então, se Fred é uma constante em um contexto, um método em outro e uma classe em um terceiro, o símbolo <b>:Fred</b> será o mesmo objeto em todos os três contextos.</p>
</div>
<p>Isso pode ser ilustrado por esse simples programa – <b>p039xsymbol.rb</b>:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="c"># p039xsymbol.rb</span>
<span class="no"> 2</span> <span class="r">class</span> <span class="cl">Test</span>
<span class="no"> 3</span> puts <span class="sy">:Test</span>.object_id.to_s
<span class="no"> 4</span> <span class="r">def</span> <span class="fu">test</span>
<span class="no"> 5</span> puts <span class="sy">:test</span>.object_id.to_s
<span class="no"> 6</span> <span class="iv">@test</span> = <span class="i">10</span>
<span class="no"> 7</span> puts <span class="sy">:test</span>.object_id.to_s
<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> t = <span class="co">Test</span>.new
<span class="no">11</span> t.test
</pre>
</div>
<p>A saída que obtive quando rodei o programa no meu PC foi:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p039xsymbol.rb
<span class="no">2</span> 116458
<span class="no">3</span> 79218
<span class="no">4</span> 79218
<span class="no">5</span> >Exit code: 0
</pre>
</div>
<p>Aqui temos outro exemplo – p039xysymbol.rb:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="c"># p039xysymbol.rb</span>
<span class="no">2</span> sabe_ruby = <span class="sy">:sim</span>
<span class="no">3</span> <span class="r">if</span> sabe_ruby == <span class="sy">:sim</span>
<span class="no">4</span> puts <span class="s"><span class="dl">'</span><span class="k">Voce eh um rubista</span><span class="dl">'</span></span>
<span class="no">5</span> <span class="r">else</span>
<span class="no">6</span> puts <span class="s"><span class="dl">'</span><span class="k">Aprenda Ruby</span><span class="dl">'</span></span>
<span class="no">7</span> <span class="r">end</span>
</pre>
</div>
<p>A saída é:</p>
<div class="CodeRay">
<pre><span class="no">1</span> >ruby p039xysymbol.rb
<span class="no">2</span> Voce eh um rubista
<span class="no">3</span> >Exit code: 0
</pre>
</div>
<p>No exemplo, <b>:sim</b> é um símbolo. Símbolos não contêm valores ou objetos como as variáveis Ao invés disso, eles são usados como um nome consistente no código. Por exemplo, no código mostrado anteriormente você poderia facilmente substituir o símbolo por<br />
uma string como no exemplo <b>p039xyzsymbol.rb</b>:</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="c"># p039xyzsymbol.rb</span>
<span class="no">2</span> sabe_ruby = <span class="s"><span class="dl">'</span><span class="k">sim</span><span class="dl">'</span></span>
<span class="no">3</span> <span class="r">if</span> sabe_ruby == <span class="s"><span class="dl">'</span><span class="k">sim</span><span class="dl">'</span></span>
<span class="no">4</span> puts <span class="s"><span class="dl">'</span><span class="k">Voce eh um rubista</span><span class="dl">'</span></span>
<span class="no">5</span> <span class="r">else</span>
<span class="no">6</span> puts <span class="s"><span class="dl">'</span><span class="k">Aprenda Ruby</span><span class="dl">'</span></span>
<span class="no">7</span> <span class="r">end</span>
</pre>
</div>
<p>Isto tem o mesmo resultado, mas não é mais eficiente. Nesse exemplo, cada menção do ‘sim’ cria um novo objeto armazenado separadamente em memória, enquanto símbolos são valores com referência única inicializados apenas uma vez. No primeiro exemplo,<br />
apenas <b>:sim</b> existe, enquanto no segundo exemplo você têm duas strings ‘sim’ e ‘sim’ ocupando espaço na memória.</p>
<p>Podemos também transformar uma string em um símbolo e vice-versa:</p>
<div class="CodeRay">
<pre><span class="no">1</span> puts <span class="s"><span class="dl">"</span><span class="k">string</span><span class="dl">"</span></span>.to_sym.class <span class="c"># Symbol</span>
<span class="no">2</span> puts <span class="sy">:symbol</span>.to_s.class <span class="c"># String</span>
</pre>
</div>
<p>Símbolos são particularmente úteis quando se cria hashes e você quer distinguir chaves e valores. Veja o tópico <a href="hashes-ruby.html">usando símbolos como chaves hash</a> para exemplos práticos.</p>
<div class='box'>
<p>Fabio Akita, um entusiasta Rails brasileiro, também conhecido na internet como “AkitaOnRails”, escreve um artigo exclusivo sobre símbolos em Ruby (<a href="http://rubylearning.com/blog/2007/11/26/akitaonrails-on-ruby-symbols/">em inglês</a> ou <a href="http://akitaonrails.com/2007/11/26/ruby-symbols">em português</a>) para membros do rubylearning.com. Leia o artigo após ter passado por essa lição.</p>
</div>
<div class="pagination"><a href="hashes-ruby.html">Hashes (dicionários) ></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>