<?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>Lucas Teixeira &#187; Scala</title>
	<atom:link href="http://lucastex.com.br/tag/scala/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Fri, 07 Jan 2011 12:44:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Não tenha medo das closures</title>
		<link>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/</link>
		<comments>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 13:55:24 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[mop]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=26</guid>
		<description><![CDATA[

Você tem medo das closures? Já vi muita gente dizer que closures são perigosas e trazê-las a tona seria como acordar um monstro adormecido (o medonho GOTO &#8211; veja uma ótima definição neste link).
Não eu não concordo, closures só querem o seu bem, eis a razão.
Bom, uma closure nada mais é que um trecho de [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F21%252Fnao-tenha-medo-das-closures%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22N%C3%A3o%20tenha%20medo%20das%20closures%22%20%7D);"></div>
<p>Você tem medo das <a href="http://en.wikipedia.org/wiki/Closure_%28computer_science%29">closures</a>? Já vi muita gente dizer que closures são perigosas e trazê-las a tona seria como acordar um monstro adormecido (o medonho <a href="http://i.techrepublic.com.com/blogs/goto.png">GOTO</a> &#8211; veja uma ótima definição neste link).</p>
<p>Não eu não concordo, closures só querem o seu bem, eis a razão.</p>
<p>Bom, uma closure nada mais é que um trecho de código! Mas o que difere este bloco de instruções chamado closure de um método? A grande diferença neste caso, é que as closures são um pouco mais flexíveis que os métodos, e por sua vez podem até ser passadas como parâmetro na chamada de outras funções, ou seja, podem ser atribuídas a uma variável.</p>
<p>Em <a href="http://en.wikipedia.org/wiki/Java_%28programming_language%29">java</a> não temos closures nativas na linguagem, e uma das formas de tentar alcançar o objetivo é através do uso de <a href="http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html">classes anônimas</a>, o que particularmente não me agrada muito, pela sujeira que fica no código.</p>
<p>Em um primeiro exemplo, mais simples, segue como definir uma closure, associá-la a uma variável e depois executá-la. (exemplo em <a href="http://groovy.codehaus.org/">groovy</a>).</p>
<pre class="brush: groovy; title: ;">def c = {
    println &quot;Testando o uso de uma closure&quot;
}
c.call()</pre>
<p>Este é um exemplo simples, onde a frase acima será impressa no console.</p>
<p>Para incrementarmos um pouco, podemos fazer com que nossa closure receba um parâmetro para usá-lo dentro da execução, além de criar um método que faça o uso dela. O exemplo abaixo mostra isto.</p>
<pre class="brush: groovy; title: ;">//definição da closure para dizer oi
def ola = { nome -&gt;
    println &quot;E ai ${nome}, tudo bom?&quot;
}

//definição da closure para dizer tchau
def tchau = { nome -&gt;
    println &quot;To indo ${nome}, ate a proxima!&quot;
}

//criação do método que fará o uso da closure
void falar(Closure c, String paraQuem) {
    c.call(paraQuem)
}

//invoke do método com as closures de parametro
//note que a closure é passada como se fosse uma variável qualquer
falar(ola, &quot;Fulano&quot;)
falar(tchau, &quot;Ciclano&quot;)</pre>
<p>Mas uma das maiores vantagens que eu enxergo nas closures, é a possibilidade de definição delas em runtime. Isso mesmo, conforme você programa, pode criar uma nova closure e chamar uma função que precise dela! Vemos isso em ruby e groovy com frequência para métodos onde iteramos listas e mapas.</p>
<p>Por exemplo, as listas e arrays em groovy possuem um método each que recebe uma closure como parâmetro, esta closure define o que será feito com cada um dos items da lista/array em questão. O exemplo abaixo mostra a praticidade de se fazer a definição da closure inline, ou seja, sem criar uma variável para ela antes.</p>
<p>Em groovy</p>
<pre class="brush: groovy; title: ;">//groovy
def lista = [&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;]
lista.each { equipe -&gt;
    println &quot;A equipe ${equipe} correu na #F1 em 2009&quot;
}</pre>
<p>Em ruby</p>
<pre class="brush: ruby; title: ;">
#ruby
lista = [&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;]
lista.each { |equipe|
    puts &quot;A equipe #{equipe} correu na #F1 em 2009&quot;
}
</pre>
<p>Em scala</p>
<pre class="brush: scala; title: ;">//scala
val teams = List(&quot;Ferrari&quot;, &quot;RBR&quot;, &quot;STR&quot;, &quot;Brawn&quot;, &quot;Renault&quot;, &quot;Williams&quot;)
teams foreach {
   team =&gt; printf(&quot;A equipe %s correu na #F1 em 2009&quot;, team)
}
</pre>
<p>Dá pra perceber que a closure foi criada já no momento em que ela foi usada. Desta maneira, além de fácil, um código muito mais limpo e fácil de ser entendido.</p>
<p>Acredite, closures são suas amigas, e estão aqui pra te ajudar, então aproveite!</p>
<p>Ahh, e fica a dica de sempre: Ler a documentação:</p>
<p>Closures em Groovy <a href="http://groovy.codehaus.org/Closures" target="_blank">(wiki)</a> <a href="http://groovy.codehaus.org/api/groovy/lang/Closure.html">(groovydoc)</a> <a href="http://groovy.codehaus.org/Closures+-+Formal+Definition" target="_blank">(definição formal)</a><br />
Closures (Proc) em Ruby <a href="http://www.ruby-doc.org/core/classes/Proc.html" target="_blank">(doc)</a> <a href="http://c2.com/cgi/wiki?BlocksInRuby" target="_blank">(wiki)</a><br />
Closures em Scala <a href="http://www.scala-lang.org/node/138" target="_blank">(wiki)</a></p>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/21/nao-tenha-medo-das-closures/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

