<?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>Saga do programador &#187; blocos</title>
	<atom:link href="http://www.sagadoprogramador.com.br/tag/blocos/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sagadoprogramador.com.br</link>
	<description></description>
	<lastBuildDate>Wed, 18 Aug 2010 13:34:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>DRY e Blocos de Código com Ruby</title>
		<link>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/</link>
		<comments>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 02:54:22 +0000</pubDate>
		<dc:creator>Sergio Azevedo Junior</dc:creator>
				<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[block]]></category>
		<category><![CDATA[blocos]]></category>
		<category><![CDATA[blocos de codigo ruby]]></category>
		<category><![CDATA[ruby block]]></category>
		<category><![CDATA[ruby blocks]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=451</guid>
		<description><![CDATA[O Iuri já mostrou num post anterior, como criar métodos (funções) em ruby. Sendo assim somos praticamente craques em construir funções ruby. Neste post vamos explorar recursos avançados e interessantes das funçoes ruby, para isso, utilizaremos um array com alguns nomes.
Problema Inicial:
Devemos criar um  método que seja capaz de percorrer um array, exibindo seus elementos. (Ok, tudo [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://twitter.com/iurims">Iuri</a> já mostrou num <a href="http://www.sagadoprogramador.com.br/2009/07/aprenda-ruby-parte-v-metodos/">post anterior</a>, como criar métodos (funções) em ruby. Sendo assim somos praticamente craques em construir funções ruby. Neste post vamos explorar recursos avançados e interessantes das funçoes ruby, para isso, utilizaremos um array com alguns nomes.</p>
<h2>Problema Inicial:</h2>
<p>Devemos criar um  método que seja capaz de percorrer um array, exibindo seus elementos. <em>(Ok, tudo bem nós sabemos que todo array possui um método each. Mas vamos fingir que esse kra não existe)</em></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> elemento
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Ótimo! Atingimos nosso objetivo. O codigo acima exibira os nomes contidos no array.</p>
<h2>Os requisitos mudaram:</h2>
<p>Agora nós queremos  percorrer o array exibindo cada um de seus elementos ao contrario, por exemplo, "sergio" será exibido como "oigres". Podemos criar um novo método para isso, então vamos ao trabalho:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;</span>span id=<span style="color:#996600;">&quot;more-451&quot;</span><span style="color:#006600; font-weight:bold;">&gt;&lt;/</span>span<span style="color:#006600; font-weight:bold;">&gt;</span>def mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> lista <span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Perfeito! Mais uma vez concluímos nossa tarefa.</p>
<h2>DRY, mais um princípio de Desenvolvimento de Software:</h2>
<p>Os problemas anteriores envolviam operações com elementos de um array (uma lista), e assim acabamos criando dois métodos para resolver os problemas propostos. Existe um princípio de desenvolvimento de software que é focado em reduzir a repetição/duplicação de código, ele é conhecido como: <a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">Don't Repeat Yourself - (DRY)</a>. Este principio diz que:</p>
<blockquote>
<h4>"Every piece of knowledge must have a single, unambiguous, authoritative representation within a system."</h4>
</blockquote>
<p style="text-align: justify;">O que poderiamos traduzir como: <em>"Cada parte do conhecimento deve ter uma representação única e não ambigua dentro de um sistema". </em>Desta forma utilizando o DRY para analisar as funções que escrevemos até agora, podemos notar que <em>a parte do conhecimento </em>de percorrer um array não possui <em>uma representação única</em> em nosso sistema. O ideal seria que o codigo de percorrer um array nao fosse mais repetido, e é exatamente nisso que vamos trabalhar agora.</p>
<h2>Aplicando o DRY</h2>
<p>A maneira mais simples de resolvemos o problema de duplicação do codigo de percorrer o array, é sem duvida realizar um refactor chamado <a href="http://sourcemaking.com/refactoring/extract-method">extract method</a>, e assim isolar a lógica de percorrer arrays em um método. Entao vamos lá:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
   percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span><span style="color:#006600; font-weight:bold;">&#41;</span>
   <span style="color:#CC0066; font-weight:bold;">puts</span> elemento
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">def</span> mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
  percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">array</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
mostra_elementos<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span>
mostra_elementos_ao_contrario<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Pronto! Com este método que acabamos de criar eliminamos o problema de  repetição de código. Porém ao executar este programa receberemos uma mensagem de erro. O grande problema aqui é que agora os métodos <em>mostra_elementos </em>e <em>mostra_elementos_ao_contrario</em> não conseguem mais acessar cada elemento do array. Estes métodos agora usam a função percorre_array, e somente dentro desta função é que a variavel <em>elemento</em> existe. Neste ponto podemos pensar que, ou fazemos a coisa ficar DRY, ou fazemos o programa funcionar. Calma, com Ruby nos poderemos fazer isso funcionar e ainda ser DRY. Para isso só precisamos aprender a usar os famosos blocos do Ruby.</p>
<h2>Ruby block's</h2>
<p>Com certeza você já ouviu, que tudo em ruby é objeto. Na verdade mesmo, quase tudo em Ruby é objeto, por exemplo blocos de código não são objetos. Mas o importante é  que  em Ruby podemos armazenar trechos de código em um objeto especial que se chama Proc. Veja:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">bloco = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
bloco.<span style="color:#9900CC;">call</span></pre></div></div>

<p>Acabamos de criar um objeto, que contem código, e fizemos isso utilizando Proc.new e fornecendo o código através das chaves  "{ }". De posse de uma Proc, podemos executar o código que ela contem a qualquer momento. Basta pra isso usar o método call da Proc. No exemplo acima ao chamar <em>bloco.call </em>veremos o texto <em>s</em><em>ou um bloco de codigo<strong>.</strong><span style="font-style: normal;"> O interessante disso é que agora podemos passar </span> código </em> como parametro, veja um exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span> block <span style="color:#006600; font-weight:bold;">&#41;</span>
  block.<span style="color:#9900CC;">call</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
bloco = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span>bloco<span style="color:#006600; font-weight:bold;">&#41;</span>
faco_o_que_mandar <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Mais um bloco&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Mas podemos fazer como os rubistas fazem na maioria das vezes. Eles chamam a função e passam o bloco como parametro, para isso precisamos fazer uma pequena alteração em nossa função, basta colocar um <strong>&#038;</strong> a frente do nome do nosso parametro. Outra coisa é que geralmente os rubistas utilizam a plavara <strong>yield</strong> ao invés de coisas como <strong>bloco.call</strong>, vamos mudar isso também:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> faco_o_que_mandar<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">yield</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
faco_o_que_mandar <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;sou um bloco de codigo tipo rubista&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
faco_o_que_mandar <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;blocos do end sao usados quando vc quer&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;fazer coisas que precisem de mais de uma&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;linha =)&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>O grande barato é que agora escrevemos uma função que recebe e executa um código "visitante". Este é um recurso muito poderoso, e é graças a ele que vamos conseguir resolver o problema de percorrer um array para fazer coisas diferentes com seus elementos, sem precisar repetir código.</p>
<h2>Tirando vantagem dos blocos</h2>
<p>Bem, nós já temos uma função que sabe andar em um array. Agora só precisamos fazer esta função receber um bloco de código "visitante" e assim teremos tudo resolvido. Vamos então ao trabalho:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento <span style="color:#006600; font-weight:bold;">&#125;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span> <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p><em>Neste momento você pode estar se perguntando o porquê do bloco de código estar fora dos parênteses. Por mais estranho que possa parecer é desse jeito que funciona mesmo. Os blocos são informados depois dos parametros "convencionais".</em></p>
<p>Agora seria ótimo se isso funcionasse, não é? Pena que não vai funcionar. Ao executar esse código veremos o seguinte erro: <span style="color: #ff0000;">undefined local variable or method `elemento' for main:Object (NameError).</span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Repare no erro, ele diz que a variavel <em>elemento </em>não está definida. Isso aconteceu porque esta variavel é local do método <em>percorre_array</em>, ou seja só existe, e só é visivel naquele método. Nós precisamos manipular esta variavel, para que isto seja possível o método que <strong>possui</strong> a variavel precisa permitir que os blocos visitantes utilizem esta variavel. Fazer isso é simples, basta que no <strong>yield</strong> nos passemos a variavel em questão como parâmetro. </span></span></p>
<p><span style="color: #ff0000;"><span style="color: #000000;">Quando colocamos o  <strong>yield</strong> na função é como se dissesemos: "Rode o codigo visitante agora". E quando colocamos a frente do <strong>yield</strong> parâmetros é como se dissessemos: "Ei código vistante, se você quiser pode usar estes caras aqui que eu tenho". Vejamos como fica isso no nosso codigo:</span></span></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#CC0066; font-weight:bold;">array</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>block <span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">for</span> elemento <span style="color:#9966CC; font-weight:bold;">in</span> <span style="color:#CC0066; font-weight:bold;">array</span>
    <span style="color:#008000; font-style:italic;">#agora estamos expondo a variavel elemento</span>
    <span style="color:#008000; font-style:italic;"># para o codigo visitante</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span> elemento
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
lista = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;sergio&quot;</span>,<span style="color:#996600;">&quot;roberto&quot;</span>, <span style="color:#996600;">&quot;iuri&quot;</span>,<span style="color:#996600;">&quot;luiz&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#008000; font-style:italic;"># uma pequena alteracao é necessaria aqui</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>elemento<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#CC0066; font-weight:bold;">puts</span> elemento <span style="color:#006600; font-weight:bold;">&#125;</span>
percorre_array<span style="color:#006600; font-weight:bold;">&#40;</span>lista<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>elemento<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> elemento.<span style="color:#9900CC;">reverse</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Agora sim o código funciona. A linha<em></em> <em>yield elemento</em>, tem o efeito de enviar para o bloco visitante a variavel <em>elemento </em>como parametro. Assim a cada iteracao do loop for um novo valor é enviado ao código visitante através da variavel <em>elemento.</em> Com isso nosso trabalho está terminado, implementamos as funcionalidades solicitadas, sem repetir código, e de quebra aprendemos sobre DRY e blocos de código em Ruby.</p>
<p>Bloco de código é um assunto bem interessante, e aqui nós abordamos só uma pequena parte. Tem ainda um lance de lambdas, enfim como disse antes o assunto é muito interessante, e se você quiser saber mais pode olhar um post do Anderson Leite sobre isso, <a href="http://andersonleiteblog.wordpress.com/2010/02/18/metaprogramacao-procs-lambdas-e/">o link é este</a>.</p>
<p>Abraços.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2010/02/dry-e-blocos-de-codigo-com-ruby/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Aprenda Ruby &#8211; parte III</title>
		<link>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iii/</link>
		<comments>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iii/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 01:22:09 +0000</pubDate>
		<dc:creator>Iuri Menescal</dc:creator>
				<category><![CDATA[OO]]></category>
		<category><![CDATA[Ruby para iniciantes]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[aprenda ruby]]></category>
		<category><![CDATA[Array]]></category>
		<category><![CDATA[blocos]]></category>
		<category><![CDATA[String]]></category>
		<category><![CDATA[Tutorial Ruby]]></category>

		<guid isPermaLink="false">http://www.sagadoprogramador.com.br/?p=244</guid>
		<description><![CDATA[String
Acho que agora as coisas começam a ficar mais divertidas  
Não é minha intenção, ficar explicando cada classe básica do Ruby, acho que mais importante focarmos no conceito da linguagem, acredito que a melhor forma de aprender a programar é praticando, por tanto vou usar alguns exemplos utilizando funcionalidades da String e do Array, [...]]]></description>
			<content:encoded><![CDATA[<h3>String</h3>
<p>Acho que agora as coisas começam a ficar mais divertidas <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Não é minha intenção, ficar explicando cada classe básica do Ruby, acho que mais importante focarmos no conceito da linguagem, acredito que a melhor forma de aprender a programar é praticando, por tanto vou usar alguns exemplos utilizando funcionalidades da String e do Array, para explicar os conceitos e ao mesmo tempo mostrar como é produtivo programar em Ruby.</p>
<p>Para entender os recursos de cada classe, basta olhar a <a href="http://www.ruby-doc.org/">documentação do Ruby</a> que é bem abrangente.</p>
<p>Vamos ver alguns exemplos, de como podemos concatenar valores em uma string:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel = variavel<span style="color:#006600; font-weight:bold;">+</span><span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#pode ser assim também</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel <span style="color:#006600; font-weight:bold;">+</span>= <span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#Também podemos fazer assim</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel.<span style="color:#9900CC;">concat</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; quatro cinco seis&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#ou melho ainda, esse é muito maneiro, o código fica claro!</span>
variavel = <span style="color:#996600;">&quot;um dois tres&quot;</span>
variavel <span style="color:#006600; font-weight:bold;">&amp;</span>lt;<span style="color:#006600; font-weight:bold;">&amp;</span>lt; <span style="color:#996600;">&quot; quatro cinco seis&quot;</span>
<span style="color:#008000; font-style:italic;">#alem de claro, esse tipo de atribuição é mais rápido.</span></pre></div></div>

<p>Viu por que Ruby é agil?<br />
- Até minha mãe entende que com esse simbolo "&lt;&lt;" estou inserindo uma valor na String <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
É claro que em java temos outros modos de concatenar valores em uma String, mas provavelmente alguns deles nos obriga a instanciar alguma classe utilitária como o <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/StringBuilder.html">StringBuilder</a>, por exemplo.</p>
<p><span id="more-244"></span></p>
<p>Gostou? você ainda não viu nada, olha só que F0D@! :p</p>
<p><strong><em>Delete</em></strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#aqui eu quero remover todas as vogais de uma String</span>
<span style="color:#996600;">&quot;a b c d e f g h i &quot;</span>.<span style="color:#9900CC;">delete</span> <span style="color:#996600;">&quot;aeiou&quot;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;b c d f g h&quot;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#podemos utilizar exceções.</span>
<span style="color:#008000; font-style:italic;">#vamos remover todas as vogais, exceto a vogal &quot;i&quot;</span>
<span style="color:#996600;">&quot;a b c d e f g h i&quot;</span>.<span style="color:#9900CC;">delete</span> <span style="color:#996600;">&quot;aeiou&quot;</span>, <span style="color:#996600;">&quot;^i&quot;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#996600;">&quot;b c d f g h i&quot;</span></pre></div></div>

<p>Quer ver mais?</p>
<pre class="ruby">#Conversão de case
"saga do programador".upcase
=&gt; "SAGA DO PROGRAMADOR"
"SAGA DO PROGRAMADOR".downcase
=&gt;"saga do programador"

#olha só que maneiro:
#veja como esse código é expressivo!
"saga do programador".include? "programador"
=&gt; true
#é esse tipo de coisa q faz a diferença
#quero saber quantos caracteres diferentes existem entre as Strings
"Iuri" &lt;=&gt; "Iure"
=&gt; 1
#agora eu quero tirar caracteres duplicados de uma String
"google".tr_s("o","o")
=&gt; "gogle"
"google".tr_s("o","")
=&gt; ggle</pre>
<p><strong>Arrays:</strong></p>
<p>Na boa! Quando comecei a programar, aprendi sobre Arrays com o velho Pascal, achei muito chato. Pelas dificuldades apresentandas para recuperar os dados.</p>
<p>Com a evolução das linguagens as coisas foram melhorando, mas definitivamente trabalhar com Arrays em linguagens dinâmicas, supera as expectativas!</p>
<p><strong>Vamos aos exemplos:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#Criando uma array em Ruby:</span>
meuArray = <span style="color:#006600; font-weight:bold;">&#91;</span>“um”, “dois”,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span>“um”,”dois”,<span style="color:#006666;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#008000; font-style:italic;">#Sim é isso mesmo! Eu posso ter tipos diferentes dentro do mesmo Array</span></pre></div></div>

<p>Olha com as coisas ficam ainda mais legais, quando nos aproveitamos das facilidades que a linguagem Ruby nos proporciona com o conceito de blocos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">meuArray = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#125;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Alguma vez você imaginou preencher um Array de maneira tão simples, como no exemplo abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">meuArray = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span> n<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#125;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span>,<span style="color:#006666;">4</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>No post <a href="../?p=199">anterior</a> eu finalizei com a seguinte pergunta:<br />
Tenho uma String com seguinte valor “um dois tres quatro cinco”, como você faria em uma linguagem chata para transformar essa String em um array contendo cinco itens?</p>
<p>Bom, existe N maneires de fazer isso em N linguagens, meu exemplo de linguagem chata, será em delphi, vamos a roubada rs.. :</p>

<div class="wp_syntax"><div class="code"><pre class="pascal" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//Para facilitar, ao invés de utilizar um Array, vou usar a classe TStringList.</span>
<span style="color: #000000; font-weight: bold;">Var</span>
  valor<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">String</span>;
  listaValor<span style="color: #339933;">:</span> TStringList;
<span style="color: #000000; font-weight: bold;">begin</span>
  valor <span style="color: #339933;">:=</span> <span style="color: #ff0000;">'um dois tres quatro cinco'</span>;
  listaValor <span style="color: #339933;">:=</span> TStringList.<span style="color: #0066ee;">Create</span>;
  valor <span style="color: #339933;">:=</span> StringReplace<span style="color: #009900;">&#40;</span>valor<span style="color: #339933;">,</span><span style="color: #ff0000;">' '</span><span style="color: #339933;">,</span><span style="color: #ff0000;">','</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span>rfReplaceAll<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>;
  listaValor.<span style="color: #0066ee;">CommaText</span> <span style="color: #339933;">:=</span> valor;
<span style="color: #000000; font-weight: bold;">end</span>;</pre></div></div>

<p>Agora em Ruby:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#Preste atenção como é complexo rs...</span>
meuArray = <span style="color:#006600; font-weight:bold;">%</span>w<span style="color:#006600; font-weight:bold;">&#40;</span>um dois tres quatro cinco<span style="color:#006600; font-weight:bold;">&#41;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span>“um”,”dois”,”tres”,”quatro”,”cinco”<span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Outros exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#Sim! O operador &quot;&amp;lt;&amp;lt;&quot; também funciona para o Array</span>
&nbsp;
meuArray = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
meuArray <span style="color:#006600; font-weight:bold;">&amp;</span>lt;<span style="color:#006600; font-weight:bold;">&amp;</span>lt; <span style="color:#006666;">2</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>No incio desse topico sobre arrays, comentei que um dos grandes problemas de trabalhar com Arrays nas linguagens chatas, e a dificuldade para manipular os dados, vamos ver agora uma pequena amostra, das facilidades que o Ruby nos oferece para trabalhar com isso:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">meuArray = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span>,<span style="color:#006666;">4</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#93;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span>,<span style="color:#006666;">2</span>,<span style="color:#006666;">3</span>,<span style="color:#006666;">4</span>,<span style="color:#006666;">5</span><span style="color:#006600; font-weight:bold;">&#93;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#Retornar só os numero pares, mais uma vez vou me prevalecer do conceito de blocos.</span>
&nbsp;
arrayPares = meuArray.<span style="color:#CC0066; font-weight:bold;">select</span><span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>valor<span style="color:#006600; font-weight:bold;">|</span> valor<span style="color:#006600; font-weight:bold;">%</span>2==<span style="color:#006666;">0</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
=<span style="color:#006600; font-weight:bold;">&amp;</span>gt; <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">2</span>,<span style="color:#006666;">4</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>Bom, por enquanto é só!<br />
Acho que agora as coisas estão ficando mais com a cara do Ruby, pois deixamos de lado o bla bla e passamos para a pratica, algo mais produtivo, talvez você ainda não tenha notado, mas nesse post conseguimos trabalhar bastante um otimo conceito do Ruby que são os blocos. A intenção daqui para frente é utilizar exemplos de códigos, para expressar os conceitos das funcionalidades que essa maravilhosa linguagem nos proporciona <img src='http://www.sagadoprogramador.com.br/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Até a próxima!</p>
<p>Iuri Menescal</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sagadoprogramador.com.br/2009/06/aprenda-ruby-parte-iii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
