<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Debugando.com &#187; Tutorial</title>
	<atom:link href="http://www.debugando.com/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.debugando.com</link>
	<description>Noticias, dicas e tutorias do mundo da Tecnologia.</description>
	<lastBuildDate>Thu, 01 Dec 2011 23:44:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Micro-Tutorial de Ruby &#8211; Parte III</title>
		<link>http://www.debugando.com/micro-tutorial-de-ruby-parte-iii/</link>
		<comments>http://www.debugando.com/micro-tutorial-de-ruby-parte-iii/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 12:28:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.debugando.com/?p=263</guid>
		<description><![CDATA[


Tipos Básicos
Continuando com os tipos básicos de Ruby (no artigo anterior já falamos de Arrays e Hashes):
Strings
Novamente, nada de muito surpreendente aqui:
&#62;&#62; palavra = "bla bla"
=&#62; "bla bla"
&#62;&#62; palavra.size
=&#62; 7

A operação mais comum em string é a concatenação:

&#62;&#62; nome = "Diego"
=&#62; "Diego"
&#62;&#62; sobrenome = "Moreira"
=&#62; "Moreira"
&#62;&#62; nome + " " + sobrenome
=&#62; "Diego Moreira"

Porém, já [...]]]></description>
			<content:encoded><![CDATA[<h2>Tipos Básicos</h2>
<p>Continuando com os tipos básicos de Ruby (no artigo anterior já falamos de Arrays e Hashes):</p>
<h3>Strings</h3>
<p>Novamente, nada de muito surpreendente aqui:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>&gt;&gt; palavra = <span class="s"><span class="dl">"</span><span class="k">bla bla</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">bla bla</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; palavra.size<tt>
</tt>=&gt; <span class="i">7</span></em><tt>

</tt>A operação mais comum em string é a concatenação:
<em>
&gt;&gt; nome = <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; sobrenome = <span class="s"><span class="dl">"</span><span class="k">Moreira</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Moreira</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; nome + <span class="s"><span class="dl">"</span><span class="k"> </span><span class="dl">"</span></span> + sobrenome<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Diego Moreira</span><span class="dl">"</span></span></em><tt>

</tt>Porém, já vimos em seções anteriores outra maneira
de fazer a mesma concatenação:

<em>&gt;&gt; <span class="s"><span class="dl">"</span><span class="il"><span class="dl">#{</span>nome<span class="dl">}</span></span><span class="k"> </span><span class="il"><span class="dl">#{</span>sobrenome<span class="dl">}</span></span><span class="dl">"</span></span><tt>
</tt>=&gt; </em><span class="s"><em><span class="dl">"</span><span class="k">Diego Moreira</span></em><span class="dl"><em>"</em>

</span></span>Tudo que estiver dentro de “#{}” é executado e o resultado convertido
em String e concatenado junto com o resto. Isso deve evitar aquele
monte de “+” o tempo todo quando queremos concatenar as coisas. Um dos
lugares onde mais usamos concatenação é quando queremos strings com
quebras de linha. O jeito comum é fazer assim:

<em>&gt;&gt; nome = <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; query = <span class="s"><span class="dl">"</span><span class="k">SELECT * FROM NOMES </span><span class="ch">\n</span><span class="dl">"</span></span> +<tt>
</tt><span class="i">?&gt;</span>     <span class="s"><span class="dl">"</span><span class="k">WHERE NOME LIKE '%</span><span class="dl">"</span></span> + nome + <span class="s"><span class="dl">"</span><span class="k">%' </span><span class="ch">\n</span><span class="dl">"</span></span> +<tt>
</tt><span class="i">?&gt;</span>     <span class="s"><span class="dl">"</span><span class="k">ORDER BY NOME</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">SELECT * FROM NOMES </span><span class="ch">\n</span><span class="k">WHERE NOME LIKE '%F%' </span><span class="ch">\n</span><span class="k">ORDER BY NOME</span><span class="dl">"</span></span></em><tt>
</tt>
<tt></tt>Ou algo parecido com isso, o que é bem feio e sabemos o quanto isso se
torna impossível de dar manutenção no futuro. Mas em Ruby podemos fazer
um pouco melhor que isso:

<em>&gt;&gt; nome = <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; query = <span class="s"><span class="dl">&lt;&lt;-STR</span></span><span class="s"><span class="k"><tt>
</tt>  SELECT * FROM NOMES<tt>
</tt>  WHERE NOME LIKE '%</span><span class="il"><span class="dl">#{</span>nome<span class="dl">}</span></span><span class="k">%'<tt>
</tt>  ORDER BY NOME</span><span class="dl"><tt>
</tt>STR</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">  SELECT * FROM NOMES</span><span class="ch">\n</span><span class="k">  WHERE NOME LIKE '%F%'</span><span class="ch">\n</span><span class="k">  ORDER BY NOME</span><span class="ch">\n</span><span class="dl">"</span></span><tt>
</tt></em>
Onde está “<span class="caps">STR</span>” na realidade pode ser
qualquer palavra em letras maiúsculas, tomando o cuidado para não ter
espaços em branco nem antes nem depois do “<span class="caps">STR</span>” da última linha. 

<em>&gt;&gt; nome = <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; query = <span class="s"><span class="dl">%{</span><span class="k">SELECT * FROM NOMES<tt>
</tt>  WHERE NOME LIKE '%</span><span class="il"><span class="dl">#{</span>nome<span class="dl">}</span></span><span class="k">%'<tt>
</tt>  ORDER BY NOME</span><span class="dl">}</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">SELECT * FROM NOMES</span><span class="ch">\n</span><span class="k">  WHERE NOME LIKE '%F%'</span><span class="ch">\n</span><span class="k">  ORDER BY NOME</span><span class="dl">"</span></span></em><tt>
</tt>
E também desta maneira:

<em>&gt;&gt; nome = <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; query = <span class="s"><span class="dl">%Q(</span><span class="k">SELECT * FROM NOMES<tt>
</tt>  WHERE NOME LIKE '%</span><span class="il"><span class="dl">#{</span>nome<span class="dl">}</span></span><span class="k">%'<tt>
</tt>  ORDER BY NOME</span><span class="dl">)</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">SELECT * FROM NOMES</span><span class="ch">\n</span><span class="k">  WHERE NOME LIKE '%F%'</span><span class="ch">\n</span><span class="k">  ORDER BY NOME</span><span class="dl">"</span></span><tt>
</tt></em>
Todas as maneiras acima são jeitos de se criar strings de múltiplas
linhas com a possibilidade de execução e substituição in-place usando
“#{}”. Eu particularmente prefiro fazer alguma coisa do tipo:

<em>&gt;&gt; nome = <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">F</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; query = <span class="s"><span class="dl">%q(</span><span class="k">SELECT * FROM NOMES<tt>
</tt>  WHERE NOME LIKE '%[nome]%'<tt>
</tt>  ORDER BY NOME</span><span class="dl">)</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">SELECT * FROM NOMES</span><span class="ch">\n</span><span class="k">  WHERE NOME LIKE '%[nome]%'</span><span class="ch">\n</span><span class="k">  ORDER BY NOME</span><span class="dl">"</span></span><tt>
</tt><tt>
</tt>&gt;&gt; query.gsub!(<span class="s"><span class="dl">'</span><span class="k">[nome]</span><span class="dl">'</span></span>, nome)<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">SELECT * FROM NOMES</span><span class="ch">\n</span><span class="k">  WHERE NOME LIKE '%F%'</span><span class="ch">\n</span><span class="k">  ORDER BY NOME</span><span class="dl">"</span></span><tt>
</tt></em></pre>
<p>A sintaxe de “%q()” também permite criar strings de múltiplas linhas mas não suporta a execução de código via “#{}”, por isso coloquei algo que possa encontrar depois (um &#8220;placeholder&#8221;) como “[nome]” e no final uso o método “gsub” que faz substituição em Strings. Eu disse que “prefiro” mais para separar explicitamente as substituições fora do String. Mas, novamente, existem diversas maneiras de realizar essa mesma tarefa, depende do que você precisa fazer.</p>
<p><strong>Disclaimer:</strong> nunca crie consultas <span class="caps">SQL</span> da forma como mostrei acima. Se você apenas concatenar o valor que foi passado pelo usuário diretamente no comando <span class="caps">SQL</span> que vai executar, seu código estará automaticamente vulnerável à <a href="http://en.wikipedia.org/wiki/SQL_injection"><span class="caps">SQL</span> Injection</a>. Esse é o erro mais comum que todo desenvolvedor Web novato comete. Então cuidado! Para isso servem pacotes como ActiveRecord, que abstraem o <span class="caps">SQL</span> nativo e realizam as checagens mais comuns antes de criar o <span class="caps">SQL</span>.</p>
<h3>Symbols</h3>
<p>Note que na seção sobre Hashes, criamos um pequeno dicionário ligando uma palavra em inglês à sua tradução em português. Para isso usamos objetos String tanto para os valores quanto para as chaves, por exemplo:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>dic1 = { <span class="s"><span class="dl">"</span><span class="k">leg</span><span class="dl">"</span></span> =&gt; <span class="s"><span class="dl">"</span><span class="k">perna</span><span class="dl">"</span></span> }</em><tt>

</tt>Mas você vai notar que em Ruby e principalmente no Rails, não costumamos
usar Strings como chaves.
Em vez disso usamos Symbols:

<em>dic2 = { <span class="sy">:leg</span> =&gt; <span class="s"><span class="dl">"</span><span class="k">perna</span><span class="dl">"</span></span> }</em><tt>
</tt></pre>
<p>Quero dizer, não é proibido usar Strings, mas se não precisar, prefira usar Symbols. Existem dois motivos para isso: o primeiro é porque symbols são mais legíveis e fáceis de visualizar, a segunda é economia de memória.</p>
<p>Em poucas palavras, um Symbol sempre gera um objeto Singleton imutável. Por exemplo:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>&gt;&gt; a = <span class="sy">:leg</span><tt>
</tt>=&gt; <span class="sy">:leg</span><tt>
</tt>&gt;&gt; b = <span class="sy">:leg</span><tt>
</tt>=&gt; <span class="sy">:leg</span><tt>
</tt>&gt;&gt; a.object_id<tt>
</tt>=&gt; <span class="i">531778</span><tt>
</tt>&gt;&gt; b.object_id<tt>
</tt>=&gt; <span class="i">531778</span></em><tt>

</tt>Note como atribuímos :leg às variáveis “a” e “b”. Chamando o método
“object_id”, ambas respondem o mesmo ID, denotando que as duas
variáveis estão apontando ao mesmo objeto Symbol. Vejamos o mesmo
exemplo usando Strings:

<em>&gt;&gt; a = <span class="s"><span class="dl">"</span><span class="k">leg</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">leg</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; b = <span class="s"><span class="dl">"</span><span class="k">leg</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">leg</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; a.object_id<tt>
</tt>=&gt; <span class="i">11823830</span><tt>
</tt>&gt;&gt; b.object_id<tt>
</tt>=&gt; <span class="i">11820130</span></em><tt>
</tt></pre>
<p>Note como os dois IDs vieram diferentes. Ou seja, apesar do conteúdo ser o mesmo, as variáveis “a” e “b” estão apontando para objetos String diferentes. A primeira impressão é que são o mesmo objeto, mas na realidade são dois objetos distintos que por acaso tem o mesmo conteúdo. Espero que tenha ficado claro porque Symbols consomem menos memória que Strings.</p>
<p>Existem vários outros objetos singleton em Ruby. Números é um deles, afinal não faz sentido existir mais de um número “1”. O mesmo vale para objetos booleanos. Por exemplo:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>&gt;&gt; a = <span class="i">1</span><tt>
</tt>=&gt; <span class="i">1</span><tt>
</tt>&gt;&gt; b = <span class="i">1</span><tt>
</tt>=&gt; <span class="i">1</span><tt>
</tt>&gt;&gt; c = <span class="pc">true</span><tt>
</tt>=&gt; <span class="pc">true</span><tt>
</tt>&gt;&gt; d = <span class="pc">true</span><tt>
</tt>=&gt; <span class="pc">true</span><tt>
</tt><tt>
</tt>&gt;&gt; a.object_id == b.object_id<tt>
</tt>=&gt; <span class="pc">true</span><tt>
</tt>&gt;&gt; c.object_id == d.object_id<tt>
</tt>=&gt; <span class="pc">true</span><tt>
</tt>&gt;&gt; a = <span class="i">1</span><tt>
</tt>=&gt; <span class="i">1</span><tt>
</tt>&gt;&gt; b = <span class="i">1</span><tt>
</tt>=&gt; <span class="i">1</span><tt>
</tt>&gt;&gt; c = <span class="pc">true</span><tt>
</tt>=&gt; <span class="pc">true</span><tt>
</tt>&gt;&gt; d = <span class="pc">true</span><tt>
</tt>=&gt; <span class="pc">true</span><tt>
</tt><tt>
</tt>&gt;&gt; a.object_id == b.object_id<tt>
</tt>=&gt; <span class="pc">true</span><tt>
</tt>&gt;&gt; c.object_id == d.object_id<tt>
</tt>=&gt; <span class="pc">true</span></em><tt>
</tt></pre>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">Na prática, sempre use Symbols como chaves de Hash. É onde eles são
mais usados. Em Ruby on Rails, o pacote ActiveSupport consegue traduzir
Hashes com chaves em String para Symbols, desta forma:
<em>
&gt;&gt; require <span class="s"><span class="dl">'</span><span class="k">rubygems</span><span class="dl">'</span></span><tt>
</tt>=&gt; []<tt>
</tt>&gt;&gt; require <span class="s"><span class="dl">'</span><span class="k">activesupport</span><span class="dl">'</span></span><tt>
</tt>=&gt; []<tt>
</tt>&gt;&gt; params = { <span class="s"><span class="dl">"</span><span class="k">nome</span><span class="dl">"</span></span> =&gt; <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span>, <span class="s"><span class="dl">"</span><span class="k">sobrenome</span><span class="dl">"</span></span> =&gt; <span class="s"><span class="dl">"</span><span class="k">Moreira</span><span class="dl">"</span></span> }<tt>
</tt>=&gt; {<span class="s"><span class="dl">"</span><span class="k">nome</span><span class="dl">"</span></span>=&gt;<span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span>, <span class="s"><span class="dl">"</span><span class="k">sobrenome</span><span class="dl">"</span></span>=&gt;<span class="s"><span class="dl">"Moreira</span><span class="dl">"</span></span>}<tt>
</tt>&gt;&gt; params.symbolize_keys!<tt>
</tt>=&gt; {<span class="sy">:nome</span>=&gt;<span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span>, <span class="sy">:sobrenome</span>=&gt;<span class="s"><span class="dl">"Moreira</span><span class="dl">"</span></span>}<tt>
</tt>&gt;&gt; params[<span class="sy">:nome</span>]<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; params[<span class="sy">:sobrenome</span>]<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Moreira</span><span class="dl">"</span></span></em><tt>
</tt></pre>
<h2>Métodos em Ruby</h2>
<p>Depois de tudo isso, podemos ir um pouco além. Em Ruby temos maneiras muito diferentes de se escrever métodos. Em linguagens estáticas, como Java, temos o conceito de <a href="http://en.wikipedia.org/wiki/Method_overloading">overloading</a>. Por exemplo:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>public class Pessoa {<tt>
</tt>  String nome;<tt>
</tt>  String email;<tt>
</tt><tt>
</tt>  public Pessoa(String nome, String email) {<tt>
</tt>    this.nome = nome;<tt>
</tt>    this.email = email;<tt>
</tt>  }<tt>
</tt><tt>
</tt>  public Pessoa(String nome) {<tt>
</tt>  this(nome, "");<tt>
</tt>  }<tt>
</tt>}</em><tt>

</tt>Esse trecho define a classe “Pessoa” com dois construtores.
Dessa forma podemos instanciar uma nova Pessoa da seguinte forma:</pre>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>Pessoa diego = new Pessoa("Diego", "diego@foo.com.br");<tt>
</tt>Pessoa Moreira = new Pessoa("Moreira");</em><tt>
</tt></pre>
<p>Ou seja, o parâmetro “email” é opcional. Dependendo se passamos ou não esse parâmetro, um dos dois construtores será chamado.</p>
<p>Porém, esse tipo de construção pode começar a ficar extremamente tedioso quando temos muitos parâmetros opcionais. Em Ruby temos algumas maneiras diferentes de lidar com isso. Para começar vejamos uma maneira simples:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em><span class="r">class</span> <span class="cl">Pessoa</span><tt>
</tt>  <span class="r">def</span> <span class="fu">initialize</span>(nome, email = <span class="s"><span class="dl">"</span><span class="dl">"</span></span>)<tt>
</tt>    <span class="iv">@nome</span>, <span class="iv">@email</span> = nome, email<tt>
</tt>  <span class="r">end</span><tt>
</tt><span class="r">end</span></em><tt>
</tt></pre>
<p>Duas novidades: primeiro que um método suporta valores padrão. Dessa forma, se nada for passado no segundo parâmetro, ele assume o padrão vazio &#8220;&#8221;, conforme descrevemos acima. Segundo, é possível fazer atribuição em massa. Acredito que esteja bastante óbvio entender apenas lendo o trecho acima.</p>
<p>Outra maneira:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em><span class="r">class</span> <span class="cl">Pessoa</span><tt>
</tt>  <span class="r">def</span> <span class="fu">initialize</span>(nome, *args)<tt>
</tt>    <span class="iv">@nome</span> = nome<tt>
</tt>    <span class="iv">@args</span> = args<tt>
</tt>  <span class="r">end</span><tt>
</tt>  <span class="r">def</span> <span class="fu">args</span><tt>
</tt>    <span class="iv">@args</span><tt>
</tt>  <span class="r">end</span><tt>
</tt><span class="r">end</span><tt>
</tt><tt>
</tt>&gt;&gt; diego = <span class="co">Pessoa</span>.new(<span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span>, <span class="s"><span class="dl">"</span><span class="k">diego@foo.com.br</span><span class="dl">"</span></span>, <span class="s"><span class="dl">"</span><span class="k">6666-6666</span><span class="dl">"</span></span>)<tt>
</tt>=&gt; <span class="c">#&lt;Pessoa:0x26ee61c @args=["diego@foo.com.br", "6666-6666"], @nome="Diego"&gt;</span><tt>
</tt>&gt;&gt; diego.args.first<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">diego@foo.com.br</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; diego.args.last<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">6666-6666</span><span class="dl">"</span></span></em><tt>

</tt>O que temos no contrutor acima, o “*”, é o “splat”. Pense nele como um
buraco-negro: depois do parâmetro normal “nome”, tudo que vier depois
será literalmente sugado para dentro da variável “args”. A resultante
disso será um Array. Isso permite um método que tenha capacidade para
infinitos argumentos. Outro exemplo de uso é este:
<em>
<span class="r">def</span> <span class="fu">soma</span>(*args)<tt>
</tt>  args.inject(<span class="i">0</span>) { |elem, total| total += elem }<tt>
</tt><span class="r">end</span><tt>
</tt><tt>
</tt>&gt;&gt; soma(<span class="i">2</span>,<span class="i">2</span>)<tt>
</tt>=&gt; <span class="i">4</span><tt>
</tt>&gt;&gt; soma(<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>)<tt>
</tt>=&gt; <span class="i">10</span><tt>
</tt>&gt;&gt; soma(<span class="i">100</span>,<span class="i">200</span>,<span class="i">300</span>)<tt>
</tt>=&gt; <span class="i">600</span></em><tt>
</tt></pre>
<p>Felizmente já explicamos para que serve o “inject”. Resumindo: esse método somará todos os elementos passados como parâmetros, independente de quantos forem. E ainda podemos fazer mais: passar um array expandindo seus elementos para serem parâmetros:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>&gt;&gt; items = [<span class="i">1</span>,<span class="i">2</span>,<span class="i">3</span>,<span class="i">4</span>,<span class="i">5</span>,<span class="i">6</span>]<tt>
</tt>=&gt; [<span class="i">1</span>, <span class="i">2</span>, <span class="i">3</span>, <span class="i">4</span>, <span class="i">5</span>, <span class="i">6</span>]<tt>
</tt>&gt;&gt; soma *items<tt>
</tt>=&gt; <span class="i">21</span></em><tt>

</tt>Se passássemos o array “items” sem o splat para expandí-lo, o array
inteiro seria considerado um único elemento do array “args” dentro do
método, não dando o efeito esperado, veja:

<em>&gt;&gt; soma items<tt>
</tt><span class="co">TypeError</span>: can<span class="s"><span class="dl">'</span><span class="k">t convert Fixnum into Array<tt>
</tt>  from (irb):31:in `+</span><span class="dl">'</span></span><tt>
</tt>  from (irb):<span class="i">31</span><span class="sy">:in</span> <span class="sh"><span class="dl">`</span><span class="k">soma'<tt>
</tt>  from (irb):40:in </span><span class="dl">`</span></span>inject<span class="s"><span class="dl">'</span><span class="k"><tt>
</tt>  from (irb):31:in `each</span><span class="dl">'</span></span><tt>
</tt>  from (irb):<span class="i">31</span><span class="sy">:in</span> <span class="sh"><span class="dl">`</span><span class="k">inject'<tt>
</tt>  from (irb):31:in </span><span class="dl">`</span></span>soma<span class="s"><span class="dl">'</span><span class="k"><tt>
</tt>  from (irb):40</span></span></em></pre>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">Outra situação é quando temos métodos com um número muito grande de
parâmetros opcionais. No Ruby on Rails temos exemplos como este:</pre>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>
&gt;&gt; <span class="co">Person</span>.find <span class="sy">:first</span>, <span class="sy">:conditions</span> =&gt; { <span class="sy">:nome</span> =&gt; <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span> }, <span class="sy"> <img src='http://www.debugando.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rder</span> =&gt; <span class="sy">:nome</span><tt>
</tt>=&gt; <span class="co">SELECT</span> * <span class="co">FROM</span> <span class="s"><span class="dl">"</span><span class="k">people</span><span class="dl">"</span></span> <span class="co">WHERE</span> (<span class="s"><span class="dl">"</span><span class="k">people</span><span class="dl">"</span></span>.<span class="s"><span class="dl">"</span><span class="k">nome</span><span class="dl">"</span></span> = <span class="s"><span class="dl">'</span><span class="k">Diego</span><span class="dl">'</span></span>) <span class="co">ORDER</span> <span class="co">BY</span> nome <span class="co">LIMIT</span> <span class="i">1</span></em><tt>
</tt></pre>
<p>Qualquer um que já tenha lidado com <span class="caps">SQL</span> sabe que montar consultas pode ser bastante complexo. Criar um único método que cuide disso numa linguagem estático é impossível. Se tentar criar um conjunto de métodos via overloading como vimos antes, também será um trabalho homérico e totalmente fútil.</p>
<p>Vejamos como é definido o método “find” da classe “ActiveRecord::Base”</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>
<span class="r">def</span> <span class="fu">find</span>(*args)<tt>
</tt>  options = args.extract_options!<tt>
</tt>  validate_find_options(options)<tt>
</tt>  set_readonly_option!(options)<tt>
</tt><tt>
</tt>  <span class="r">case</span> args.first<tt>
</tt>    <span class="r">when</span> <span class="sy">:first</span> <span class="r">then</span> find_initial(options)<tt>
</tt>    <span class="r">when</span> <span class="sy">:last</span>  <span class="r">then</span> find_last(options)<tt>
</tt>    <span class="r">when</span> <span class="sy">:all</span>   <span class="r">then</span> find_every(options)<tt>
</tt>    <span class="r">else</span>             find_from_ids(args, options)<tt>
</tt>  <span class="r">end</span><tt>
</tt><span class="r">end</span></em><tt>
</tt></pre>
<p>O método “find” por si só é somente um envelope que chama outros métodos. Ele recebe nada mais, nada menos que um Array, usando o splat como mostramos antes. Logo na primeira linha ele usa um método interno do Rails para extrair tudo que é considerado “options”, no caso, elementos de um Hash.</p>
<p>Dependendo do primeiro argumento, ele repassa o Hash a métodos como “find_initial”, “find_last”, etc. No caso, o Hash em questão é o seguinte:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>options = { <span class="sy">:conditions</span> =&gt; { <span class="sy">:nome</span> =&gt; <span class="s"><span class="dl">"Diego</span><span class="dl">"</span></span> }, <span class="sy"> <img src='http://www.debugando.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rder</span> =&gt; <span class="sy">:nome</span> }</em><tt>
</tt>
Vejamos um exemplo mais simples de um método com um parâmetro
obrigatório e uma lista de parâmetros opcionais:</pre>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em><span class="r">class</span> <span class="cl">Pessoa</span><tt>
</tt>  attr_accessor <span class="sy">:primeiro_nome</span>, <span class="sy">:sobrenome</span>, <span class="sy">:iniciais</span>, <span class="sy">:email</span><tt>
</tt>  <span class="r">def</span> <span class="fu">initialize</span>(primeiro_nome = <span class="s"><span class="dl">"</span><span class="dl">"</span></span>, options = {})<tt>
</tt>    <span class="iv">@primeiro_nome</span> = primeiro_nome<tt>
</tt>    <span class="iv">@sobrenome</span> = options[<span class="sy">:sobrenome</span>]<tt>
</tt>    <span class="iv">@iniciais</span> = options[<span class="sy">:iniciais</span>]<tt>
</tt>    <span class="iv">@email</span> = options[<span class="sy">:email</span>]<tt>
</tt>  <span class="r">end</span><tt>
</tt><span class="r">end</span><tt>
</tt><tt>
</tt>&gt;&gt; diego = <span class="co">Pessoa</span>.new(<span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span>, <span class="sy">:sobrenome</span> =&gt; <span class="s"><span class="dl">"</span><span class="k">Moreira</span><span class="dl">"</span></span>, <span class="sy">:iniciais</span> =&gt; <span class="s"><span class="dl">"</span><span class="k">DM</span><span class="dl">"</span></span>)<tt>
</tt>=&gt; <span class="c">#&lt;Pessoa:0x26b2c98 @iniciais="DM", @sobrenome="Moreira", @email=nil, @primeiro_nome="Diego"&gt;</span><tt>
</tt>&gt;&gt; diego.primeiro_nome<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; diego.sobrenome<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Moreira</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; diego.iniciais<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">DM</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; diego.email<tt>
</tt>=&gt; <span class="pc">nil</span></em><tt>

</tt>Caso não saiba, o método “attr_accessor” serve para criar métodos
equivalentes a “getters” e “setters” de Java ou C#. Como já falamos em
seções anteriores, classes Ruby podem ser modificadas em tempo de
execução. Veremos isso depois, por enquanto vejamos o construtor
novamente. Depois do primeiro parâmetro, temos o familiar uso do par
chave e valor. O que pode parece estranho é que talvez alguém estivesse
esperando algo assim:

<em>diego = <span class="co">Pessoa</span>.new(<span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span>, {<span class="sy">:sobrenome</span> =&gt; <span class="s"><span class="dl">"</span><span class="k">Moreira</span><span class="dl">"</span></span>, <span class="sy">:iniciais</span> =&gt; <span class="s"><span class="dl">"</span><span class="k">DM</span><span class="dl">"</span></span>})</em><tt>
</tt>
Novamente, as chaves “{}” são opcionais: os últimos parâmetros, sendo
pares com a sintaxe de “rocket” (“=&gt;”) são tratados como elementos
do mesmo Hash e todos são “sugados” para o parâmetro “options” no
método construtor. Retirando tudo que é opcional, a chamada poderia
ficar simplesmente assim:

<em>diego = <span class="co">Pessoa</span>.new <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span>, <span class="sy">:sobrenome</span> =&gt; <span class="s"><span class="dl">"</span><span class="k">Moreira</span><span class="dl">"</span></span>, <span class="sy">:iniciais</span> =&gt; <span class="s"><span class="dl">"</span><span class="k">DM</span><span class="dl">"</span></span></em> <tt>
</tt>
E assim temos algumas maneiras para criar métodos bastante flexíveis.
Obviamente, aqui cabe cuidados sobre como planejar seus métodos. Fica
muito fácil criar métodos que fazem mais do que deveriam dessa forma.
Assim como mostramos acima com o método “find” tente criar métodos
enxutos, que delegam a execução a outros métodos mais especializados,
por exemplo.</pre>
<h2>Métodos Dinâmicos</h2>
<p>Vejamos mais sobre o método “attr_accessor”:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em><span class="r">class</span> <span class="cl">Pessoa</span><tt>
</tt>  attr_accessor <span class="sy">:nome</span>, <span class="sy">:email</span><tt>
</tt><span class="r">end</span><tt>
</tt><tt>
</tt>&gt;&gt; diego = <span class="co">Pessoa</span>.new<tt>
</tt>=&gt; <span class="c">#&lt;Pessoa:0x26a6f24 @iniciais=nil, @sobrenome=nil, @email=nil, @primeiro_nome=""&gt;</span><tt>
</tt>&gt;&gt; diego.nome = <span class="s"><span class="dl">"Diego</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; diego.nome<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">Diego</span><span class="dl">"</span></span></em><tt>

</tt>Podemos reimplementar nossa própria versão simplificada de “attr_accessor” desta maneira:

<em><span class="r">class</span> <span class="cl">Object</span><tt>
</tt>  <span class="r">def</span> <span class="fu">my_accessor</span>( *symbols )<tt>
</tt>    symbols.each <span class="r">do</span> |symbol|<tt>
</tt>      module_eval( <span class="s"><span class="dl">"</span><span class="k">def </span><span class="il"><span class="dl">#{</span>symbol<span class="dl">}</span></span><span class="k">() @</span><span class="il"><span class="dl">#{</span>symbol<span class="dl">}</span></span><span class="k">; end</span><span class="dl">"</span></span> )<tt>
</tt>      module_eval( <span class="s"><span class="dl">"</span><span class="k">def </span><span class="il"><span class="dl">#{</span>symbol<span class="dl">}</span></span><span class="k">=(val) @</span><span class="il"><span class="dl">#{</span>symbol<span class="dl">}</span></span><span class="k"> = val; end</span><span class="dl">"</span></span> )<tt>
</tt>    <span class="r">end</span><tt>
</tt>  <span class="r">end</span><tt>
</tt><span class="r">end</span><tt>
</tt><tt>
</tt><span class="r">class</span> <span class="cl">Pessoa</span><tt>
</tt>  my_accessor <span class="sy">:telefone</span><tt>
</tt><span class="r">end</span><tt>
</tt><tt>
</tt>&gt;&gt; diego = <span class="co">Pessoa</span>.new<tt>
</tt>=&gt; <span class="c">#&lt;Pessoa:0x2690f30 @iniciais=nil, @sobrenome=nil, @email=nil, @primeiro_nome=""&gt;</span><tt>
</tt>&gt;&gt; diego.telefone = <span class="s"><span class="dl">"</span><span class="k">6666-6666</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">6666-6666</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; diego.telefone<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">6666-6666</span><span class="dl">"</span></span></em><tt>
</tt></pre>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">Abrindo a classe Object significa que nosso método “my_accessor” estará
disponível a qualquer classe do Ruby, já que todos herdam de Object.
Esse método recebe um array de symbols, como já descrevemos antes. Daí
usamos “each” para iterar symbol a symbol, e para cada um chamamos
“module_eval” que simplesmente executa qualquer String passado a ele,
no caso criamos dinamicamente dois métodos, os equivalente a “getter” e
“setter”. Para o exemplo :telefone, seria o mesmo que escrevêssemos:

<em><span class="r">class</span> <span class="cl">Pessoa</span><tt>
</tt>  <span class="r">def</span> <span class="fu">telefone</span>() <span class="iv">@telefone</span>; <span class="r">end</span><tt>
</tt>  <span class="r">def</span> <span class="fu">telefone=</span>(val) <span class="iv">@telefone</span> = val; <span class="r">end</span><tt>
</tt><span class="r">end</span></em><tt>

</tt>Muita gente confunde “meta-programação” com “reflexão”. Reflexão é
apenas perguntar a um objeto o que ele responde. Podemos fazer isso em
Ruby de várias maneiras:

<em>&gt;&gt; a = <span class="s"><span class="dl">"</span><span class="k">string</span><span class="dl">"</span></span><tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">string</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; a.methods<tt>
</tt>=&gt; [<span class="s"><span class="dl">"</span><span class="k">chop!</span><span class="dl">"</span></span>, <span class="s"><span class="dl">"</span><span class="k">constantize</span><span class="dl">"</span></span>, ... <span class="s"><span class="dl">"</span><span class="k">squish</span><span class="dl">"</span></span>, <span class="s"><span class="dl">"</span><span class="k">&lt;&lt;</span><span class="dl">"</span></span>]<tt>
</tt>&gt;&gt; a.respond_to? <span class="sy">:size</span><tt>
</tt><tt>
</tt>&gt;&gt; p = <span class="co">Pessoa</span>.new<tt>
</tt>=&gt; <span class="c">#&lt;Pessoa:0x261af60 @iniciais=nil, @sobrenome=nil, @email=nil, @primeiro_nome=""&gt;</span><tt>
</tt>&gt;&gt; p.telefone<tt>
</tt>=&gt; <span class="pc">nil</span><tt>
</tt>&gt;&gt; p.instance_variable_set(<span class="s"><span class="dl">"</span><span class="k">@telefone</span><span class="dl">"</span></span>, <span class="s"><span class="dl">"</span><span class="k">3333-4444</span><span class="dl">"</span></span>)<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">3333-4444</span><span class="dl">"</span></span><tt>
</tt>&gt;&gt; p.instance_variable_get(<span class="s"><span class="dl">"</span><span class="k">@telefone</span><span class="dl">"</span></span>)<tt>
</tt>=&gt; <span class="s"><span class="dl">"</span><span class="k">3333-4444</span><span class="dl">"</span></span></em><tt>
</tt></pre>
<p>Aqui vemos como todo objeto Ruby tem um método chamado “methods” que devolve um Array listando todos os métodos que ele responde. Além disso todo objeto Ruby ainda responde ao método “respond_to?” que recebe um symbol como parâmetro e responde se esse objeto responde a essa mensagem.</p>
<p>No exemplo seguinte, com a classe “Pessoa”, podemos ainda manipular diretamente a variável de instância “@telefone” sem sequer precisar de métodos acessores.</p>
<p>Como podemos ver, Reflexão em Ruby é trivial. Já vimos antes como funciona o método “send” para enviar mensagens arbitrárias e também como implementar o método “method_missing” para fazer um objeto responder a mensagens arbitrárias. Mas com exemplos como do “attr_accessor” podemos entender como manipular o comportamento de um objeto em tempo de execução.</p>
<p>Por isso dizemos que Ruby tem capacidades muito poderosas de meta-programação, que é o que o torna particularmente prazeroso de usar, sem precisar contar com sintaxes obscuras ou truques não documentados. Pensar em meta-programação faz parte do dia-a-dia de programação com Ruby.</p>
<h2>Indo além do Nulo</h2>
<p>Como mais um exemplo da flexibilidade do Ruby, vamos analisar o bom o velho “nulo”. Note que nulo é realmente nada. Não é o mesmo que zero. Não é o mesmo que uma string vazia.</p>
<p>Em Ruby, estamos falando do ‘nil’. Porém, como quase tudo em Ruby é um objeto, assim também é ‘nil’:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>&gt;&gt; <span class="pc">nil</span><tt>
</tt>=&gt; <span class="pc">nil</span><tt>
</tt>&gt;&gt; <span class="pc">nil</span>.class<tt>
</tt>=&gt; <span class="co">NilClass</span><tt>
</tt>&gt;&gt; <span class="pc">nil</span>.object_id<tt>
</tt>=&gt; <span class="i">4</span></em><tt>
</tt></pre>
<p>Ou seja, quando um método não devolve nada, ou seja, ‘nil’, ainda assim ele está devolvendo alguma coisa: a instância singleton da classe NilClass.</p>
<p>Não é difícil cair em situações onde queremos chamar um método em um objeto onde ainda não sabemos se o objeto é nil ou não. Por isso costumamos fazer algo assim:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em><span class="r">unless</span> obj.nil?<tt>
</tt>  obj.say_hello<tt>
</tt><span class="r">else</span><tt>
</tt>  <span class="pc">nil</span><tt>
</tt><span class="r">end</span></em><tt>

</tt>Aqui eu propositadamente fiz um código mais longo do que deveria,
apenas para aproveitar e demonstrar o “unless”. Pense nele como o
oposto de “if”. Em outras linguagens estamos acostumados a fazer algo
assim:

<em><span class="r">if</span> !obj.nil? ...</em><tt>

</tt>Ou seja, “se não for …”. Mas em vez disso, em Ruby preferimos dizer “a
menos que …”. Fica menos poluído do que colocar “!” ("not") o tempo
todo. Além disso chamamos o método “nil?” que checa se o objeto atual é
nulo ou não. Esse método “nil?” está presente direto da classe pai
“Object”, portanto todos os objetos no Ruby respondem a esse método, em
particular, como “nil” também é um objeto, ele também responde a esse
método:

<em>&gt;&gt; <span class="pc">nil</span>.nil?<tt>
</tt>=&gt; <span class="pc">true</span><tt>
</tt>&gt;&gt; <span class="i">1</span>.nil?<tt>
</tt>=&gt; <span class="pc">false</span></em><tt>
</tt>
E eu disse que o código acima era mais longo do que o necessário porque
sempre podemos usar o operador ternário (que também existe em outras
linguagens):

<em>obj ? obj.say_hello : <span class="pc">nil</span></em><tt>

</tt></pre>
<p>Ou seja, se “obj” devolver “true” (apenas “false” e “nil” respondem como “false” em condicionais), então chame o método “say_hello”, caso contrário, devolva ‘nil’.</p>
<p>Como em qualquer objeto, se tentarmos chamar um método em ‘nil’ que não existe, ele responderá normalmente com uma exceção:</p>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><em>&gt;&gt; <span class="pc">nil</span>.size<tt>
</tt><span class="co">NoMethodError</span>: undefined method <span class="sh"><span class="dl">`</span><span class="k">size' for nil:NilClass<tt>
</tt>  from (irb):91</span></span></em></pre>
<pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">Um outro truque que <a href="http://ozmm.org/posts/try.html">discutiu-se</a> algum tempo atrás é criar um novo método em Object chamado “try”:

<em><span class="r">class</span> <span class="cl">Object</span><tt>
</tt>  <span class="r">def</span> <span class="fu">try</span>(metodo, *args)<tt>
</tt>    send(metodo, *args) <span class="r">if</span> respond_to? metodo<tt>
</tt>  <span class="r">end</span><tt>
</tt><span class="r">end</span><tt>
</tt><tt>
</tt>&gt;&gt; <span class="s"><span class="dl">"</span><span class="dl">"</span></span>.try(<span class="sy">:size</span>)<tt>
</tt>=&gt; <span class="i">0</span><tt>
</tt>&gt;&gt; <span class="pc">nil</span>.try(<span class="sy">:size</span>)<tt>
</tt>=&gt; <span class="pc">nil</span></em><tt>
</tt></pre>
<p>Em vez de chamar um método diretamente quando ainda não sabemos se o objeto é nil ou não, podemos chamar o método “try” passando a mensagem (o nome do método) e seus parâmetros. Se o objeto para onde enviamos a mensagem souber responder essa mensagem (respond_to?), então repassamos normalmente, senão devolvemos nil.</p>
<p>Recomendo que teste todos esses exemplos no <span class="caps">IRB</span> para entender o comportamento. Esse tipo de pensamento é crucial na programação Ruby. Não quer dizer, claro, que agora devemos usar coisas como “try” o tempo todo, mas nas situações onde são necessárias, essa pode ser a diferença entre um código extremamente enxuto e expressivo do que um código burocrático e difícil de entender.</p>
<h3>Conclusão</h3>
<p>Até aqui mostramos apenas a ponta do iceberg da programação com Ruby. Existem dezenas de classes que já vêm na biblioteca padrão do Ruby que vocês precisam saber, como Net, File, FileUtils e muitos outros. Use o site <a href="http://apidock.com/">ApiDock</a> sempre que tiver dúvidas quanto à sintaxe de algum método. Lembre-se da questão de parâmetros dinâmicos, o que dificulta a documentação automática. Mas também lembre-se que o código-fonte de bibliotecas Ruby costumam ser muito simples de ler. Portanto recomendo muito que, na dúvida, procure o código-fonte (que já está na sua máquina) e tente ler direto na fonte.</p>
<p>E para ver alguns exemplos muito interessantes de resolução de problemas em Ruby, também recomendo ler o site <a href="http://rubyquiz.com/">Ruby Quiz</a> que contém uma biblioteca enorme de pequenos problemas simples com soluções muito criativas usando os recursos de Ruby.</p>
<p>O mais importante: não tente escrever Ruby da mesma forma como se escreve Java ou C#. <em>“Quando se está em Roma, faça como os romanos.”</em> Portanto, nada de usar “camelCasing” para nomear seus métodos, por exemplo, use “metodos_separados_por_underscore”. Escreva Ruby da forma Ruby.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.debugando.com/micro-tutorial-de-ruby-parte-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

