Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: gh-pages
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 137 lines (123 sloc) 8.965 kb
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
<!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>Açúcares sintáticos do Ruby</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">Açúcares sintáticos do Ruby</p>
<p>Programadores utilizam o termo açúcares sintáticos para se referir a regras especiais, que permitem que você escreva seu código de uma maneira que não correspondem as regras normais, mais que seja mais fácil de lembrar como fazer e fica melhor.</p>
<p>Vamos dizer que queremos definir o nome de um cachorro. Como ponto de partida, o nome pode ser definido junto com tudo, mais em tempo de criação do objeto, como no exemplo abaixo.</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="r">class</span> <span class="cl">NewDog</span>
<span class="no"> 2</span> <span class="r">def</span> <span class="fu">initialize</span>(breed, name)
<span class="no"> 3</span> <span class="iv">@breed</span> = breed
<span class="no"> 4</span> <span class="iv">@name</span> = name
<span class="no"> 5</span> <span class="r">end</span>
<span class="no"> 6</span> attr_reader <span class="sy">:breed</span>, <span class="sy">:name</span> <span class="c"># Apenas para leitura</span>
<span class="no"> 7</span> <span class="r">end</span>
<span class="no"> 8</span> nd = <span class="co">NewDog</span>.new(<span class="s"><span class="dl">'</span><span class="k">Doberman</span><span class="dl">'</span></span>, <span class="s"><span class="dl">'</span><span class="k">Benzy</span><span class="dl">'</span></span>)
<span class="no"> 9</span> puts nd.name
</pre>
</div>
<p>Vamos reescrever o método set_name, que nos permite definir ou redefinir o nome de um cachorro existente. Também vamos rescrever o método initialize para que ele não espere um nome:</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="r">class</span> <span class="cl">NewDog</span>
<span class="no"> 2</span> <span class="r">def</span> <span class="fu">initialize</span>(breed)
<span class="no"> 3</span> <span class="iv">@breed</span> = breed
<span class="no"> 4</span> <span class="r">end</span>
<span class="no"> 5</span> attr_reader <span class="sy">:breed</span>, <span class="sy">:name</span> <span class="c"># Apenas para leitura</span>
<span class="no"> 6</span> <span class="c"># método setter</span>
<span class="no"> 7</span> <span class="r">def</span> <span class="fu">set_name</span>(nm)
<span class="no"> 8</span> <span class="iv">@name</span> = nm
<span class="no"> 9</span> <span class="r">end</span>
<span class="no"><strong>10</strong></span> <span class="r">end</span>
<span class="no">11</span> nd = <span class="co">NewDog</span>.new(<span class="s"><span class="dl">'</span><span class="k">Doberman</span><span class="dl">'</span></span>)
<span class="no">12</span> nd.set_name(<span class="s"><span class="dl">'</span><span class="k">Benzy</span><span class="dl">'</span></span>)
<span class="no">13</span> puts nd.name
</pre>
</div>
<p>Ruby permite que você defina métodos que terminam com um sinal de igual (=). Vamos substituir set_name com um método chamado name=</p>
<div class="CodeRay">
<pre><span class="no">1</span> <span class="r">def</span> <span class="fu">name=</span>(nm)
<span class="no">2</span> <span class="iv">@name</span> = nm
<span class="no">3</span> <span class="r">end</span>
</pre>
</div>
<p>name= faz exatamente o que set_name faz e apesar do nome do método um pouco estranho, você pode chamá-lo como qualquer outro método:</p>
<div class="CodeRay">
<pre><span class="no">1</span> nd.name=(<span class="s"><span class="dl">'</span><span class="k">Benzy</span><span class="dl">'</span></span>)
</pre>
</div>
<p>Exemplo &#8211; p050newdog.rb</p>
<div class="CodeRay">
<pre><span class="no"> 1</span> <span class="r">class</span> <span class="cl">NewDog</span>
<span class="no"> 2</span> <span class="r">def</span> <span class="fu">initialize</span>(breed)
<span class="no"> 3</span> <span class="iv">@breed</span> = breed
<span class="no"> 4</span> <span class="r">end</span>
<span class="no"> 5</span> attr_reader <span class="sy">:breed</span>, <span class="sy">:name</span> <span class="c"># Apenas para leitura</span>
<span class="no"> 6</span>
<span class="no"> 7</span> <span class="c"># método setter</span>
<span class="no"> 8</span> <span class="r">def</span> <span class="fu">name=</span>(nm)
<span class="no"> 9</span> <span class="iv">@name</span> = nm
<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> nd = <span class="co">NewDog</span>.new(<span class="s"><span class="dl">'</span><span class="k">Doberman</span><span class="dl">'</span></span>)
<span class="no">14</span> <span class="c">#nd.name=('Benzy')</span>
<span class="no">15</span> nd.name = <span class="s"><span class="dl">'</span><span class="k">Benzy</span><span class="dl">'</span></span>
<span class="no">16</span> puts nd.name
</pre>
</div>
<p>O sinal de igual lhe dá algo que você conhece como &#8220;atribui um valor a algo&#8221;, assim você sabe que esta lidando com um método setter. Ele ainda parece estranho, mais Ruby cuida de tudo.</p>
<p>Ruby lhe da um pouco de açucares sintático para chamar métodos setter.</p>
<div class="CodeRay">
<pre><span class="no">1</span> nd.name=(<span class="s"><span class="dl">'</span><span class="k">Benzy</span><span class="dl">'</span></span>)
</pre>
</div>
<p>você tem permissão para fazer isso:</p>
<div class="CodeRay">
<pre><span class="no">1</span> nd.name = <span class="s"><span class="dl">'</span><span class="k">Benzy</span><span class="dl">'</span></span>
</pre>
</div>
<p>Quando o interpretador vê a mensagem &#8220;name&#8221; seguido de &#8220;=&#8221;, ele automaticamente ignora os espaços antes do sinal de igual e lê a mensagem como única, &#8220;name=&#8221; &#8211; Uma chamada para o método cujo nome é name=, o que nós definimos. Quanto ao lado direito: os parênteses são opcionais para métodos com argumentos simples, sendo assim, você pode colocar apenas &#8216;Benzy&#8217; lá e ele vai ser pego como argumento para o método name=.</p>
<div class='box'>
<p>NO RAILS: Chamadas de métodos usando sinal de igual são comuns em aplicações Rails.</p>
</div>
<div class="pagination"><a href="objetos-mutaveis-e-imutaveis.html">Objetos mutáveis e imutáveis &gt;</a></div>
   </div>

   <div class="column span-5 append-1 last">

      <p><a href="http://www.guru-sp.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.guru-sp.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.guru-sp.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>
Something went wrong with that request. Please try again.