<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: João Gugel</title>
    <description>The latest articles on DEV Community by João Gugel (@joaogugel).</description>
    <link>https://dev.to/joaogugel</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F938458%2F0669dff9-1eaa-4789-9e84-1473d025e372.jpg</url>
      <title>DEV Community: João Gugel</title>
      <link>https://dev.to/joaogugel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joaogugel"/>
    <language>en</language>
    <item>
      <title>Closures no Javascript</title>
      <dc:creator>João Gugel</dc:creator>
      <pubDate>Tue, 27 May 2025 01:41:49 +0000</pubDate>
      <link>https://dev.to/joaogugel/javascript-closures-4jjd</link>
      <guid>https://dev.to/joaogugel/javascript-closures-4jjd</guid>
      <description>&lt;p&gt;Closure é uma função que “lembra” do escopo onde foi criada, mantendo o acesso às variáveis desse escopo mesmo depois da função externa terminar. Assim, ela pode guardar e atualizar valores ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Exemplo de closure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;completeUsername&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;João Vitor Gugel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formatName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;formatName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myClosure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;completeUsername&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;myClosure&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que a função &lt;code&gt;formatName&lt;/code&gt; tem acesso a variável &lt;code&gt;username&lt;/code&gt;, mas a variável &lt;code&gt;username&lt;/code&gt; não fica exposta fora da função, ela está protegida e apenas o que está dentro da função externa (&lt;code&gt;completeUsername&lt;/code&gt;) tem acesso a esses dados.&lt;/p&gt;

&lt;p&gt;No Javascript, as funções aninhadas tem acesso às variáveis declaradas no seu escopo externo. &lt;/p&gt;

&lt;h3&gt;
  
  
  Como uma closure guarda os valores
&lt;/h3&gt;

&lt;p&gt;Ao escrever e executar uma função em Javascript, espera-se que o comportamento normal seja limpar os dados que pertencem apenas ao escopo dessa função quando ela terminar de ser executada, então os dados armazenados durante o processamento da função são removidos da memória, certo? &lt;/p&gt;

&lt;p&gt;Com uma closure fica um pouco diferente. Ao declarar uma closure (uma função dentro de outra) a função interna mantém acesso às variáveis da função externa, mesmo que ela já tenha sido executada, então os dados continuam válidos sempre que a closure for chamada. &lt;/p&gt;

&lt;p&gt;Como funciona? Veja um exemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contador1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;contador&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Começa em 5&lt;/span&gt;

&lt;span class="nf"&gt;contador1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Vira 6 &lt;/span&gt;
&lt;span class="nf"&gt;contador1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Vira 7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criamos uma função &lt;code&gt;contador&lt;/code&gt; que retorna uma &lt;strong&gt;closure&lt;/strong&gt; responsável por incrementar o valor da variável &lt;code&gt;numero&lt;/code&gt;, que está em seu escopo léxico.&lt;/p&gt;

&lt;p&gt;Essa função é iniciada com o valor 5 e, ao chamarmos a função retornada (a closure), ela mantém o acesso ao valor original passado para &lt;code&gt;contador&lt;/code&gt;. Assim, toda vez que executamos &lt;code&gt;contador1()&lt;/code&gt;, incrementamos o número anterior, que continua salvo na memória graças à closure. O valor não é perdido entre as chamadas, mesmo que a função &lt;code&gt;contador&lt;/code&gt; já tenha terminado sua execução.&lt;/p&gt;

&lt;h3&gt;
  
  
  Aplicando uma closure mais complexa
&lt;/h3&gt;

&lt;p&gt;Vamos criar uma função que retorna uma closure para verificar se um usuário tem permissão para executar uma determinada ação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;criarSistemaDePermissao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cargo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;administrador&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;leitor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;acao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;permissoes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;administrador&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;criar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;editar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;remover&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="na"&gt;leitor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ler&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;permissoes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;cargo&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;acao&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;administrador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;criarSistemaDePermissao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;administrador&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;leitor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;criarSistemaDePermissao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;leitor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;leitorPodeCriar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;leitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;criar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;administradorPodeRemover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;administrador&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;remover&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo criamos um cenário mais próximo do mundo real, como um sistema de permissões de uma aplicação com diferentes tipos de usuários. &lt;/p&gt;

&lt;p&gt;Usamos a closure para criar uma função fábrica para administradores e leitores, assim criamos um sistema personalizado para cada tipo de usuário. &lt;/p&gt;

&lt;p&gt;Como estamos usando uma closure, essa closure vai manter o estado, isso é, &lt;strong&gt;continua tendo acesso ao tipo de cargo definido quando a função foi executada pela primeira vez&lt;/strong&gt;, assim, conseguimos usar a nossa closure para checar se o usuário que ela mantém armazenado possuí permissão para executar X ação. &lt;/p&gt;

&lt;h3&gt;
  
  
  Encapsulamento com closures
&lt;/h3&gt;

&lt;p&gt;Assim como na orientação objetos, podemos usar closures para encapsular dados dentro de funções e restringir o acesso direto a eles, isso nos permite proteger o estado interno da nossa função e expor apenas o que for necessário utilizando funções com controle.&lt;/p&gt;

&lt;p&gt;Veja o exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;meuCarrinhoDeCompras&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="na"&gt;itens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adicionarItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;itens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;removerUltimoItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;itens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pegarItens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;itens&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;adicionarItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;removerUltimoItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pegarItens&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;carrinho1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;meuCarrinhoDeCompras&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;carrinho1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;adicionarItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;maçã&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [maçã]&lt;/span&gt;
&lt;span class="nx"&gt;carrinho1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;adicionarItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pera&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [maçã, pera]&lt;/span&gt;
&lt;span class="nx"&gt;carrinho1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pegarItens&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// [maça, pera]&lt;/span&gt;
&lt;span class="nx"&gt;carrinho1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removerUltimoItem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// [maçã]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criamos uma &lt;strong&gt;closure&lt;/strong&gt; para manter o acesso aos dados de um carrinho de compras. Isso nos permite proteger a variável interna &lt;code&gt;itens&lt;/code&gt;, impedindo que ela seja acessada ou modificada diretamente&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando usar uma closure?
&lt;/h3&gt;

&lt;p&gt;Espero que os exemplos que dei tenham ajudado a entender as utilidades das closures. Elas podem ser muito úteis em várias situações do dia a dia, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manter o estado entre chamadas de uma função.&lt;/li&gt;
&lt;li&gt;Encapsular dados para restringir acessos/modificações não controladas.&lt;/li&gt;
&lt;li&gt;Manter o contexto de uma função, mesmo após ter sido executada.&lt;/li&gt;
&lt;li&gt;Criar funções fábrica, como no exemplo do sistema de permissões, que cria configurações distintas para administrador e leitor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cuidado com a memória
&lt;/h3&gt;

&lt;p&gt;Closures mantêm em memória todas as variáveis do escopo externo, mesmo quando não estão sendo usadas. Por isso, evite manter dados desnecessários dentro delas. Quando precisar, limpe referências que não são mais necessárias para evitar consumo excessivo de memória.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Convertendo números binários para decimais com RUST!</title>
      <dc:creator>João Gugel</dc:creator>
      <pubDate>Sat, 06 Apr 2024 23:06:07 +0000</pubDate>
      <link>https://dev.to/joaogugel/convertendo-numeros-binarios-para-decimais-com-rust-3be3</link>
      <guid>https://dev.to/joaogugel/convertendo-numeros-binarios-para-decimais-com-rust-3be3</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/jotavetech/tech4all/tree/main/binary_decimal" rel="noopener noreferrer"&gt;Ver Código Final&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como Funciona a Conversão de Binários Para Decimais?
&lt;/h2&gt;

&lt;p&gt;Para converter um número na base 2 (binário) para um número na base 10 (decimal), multiplicamos cada digito do número binário pela potência de 2 relativa à posição que ele está ocupando:&lt;/p&gt;

&lt;p&gt;Exemplo, no número binário 1010, pegamos as posições de trás pra frente começando do 0:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0: Posição 0&lt;/li&gt;
&lt;li&gt;1: Posição 1&lt;/li&gt;
&lt;li&gt;0: Posição 2&lt;/li&gt;
&lt;li&gt;1: Posição 3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora o calculo ficaria assim: 0 * 2⁰ + 1 * 2¹ + 0 * 2² + 1 * 2³ = 10 no sistema decimal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mão na Massa
&lt;/h2&gt;

&lt;p&gt;Pronto, sabendo como funciona a conversão dos sistemas numéricos vamos criar o nosso programa usando Rust. Se você preferir, sinta-se a vontade para fazer na sua linguagem de programação favorita.&lt;/p&gt;

&lt;p&gt;Se quiser instalar o Rust, entre aqui: &lt;a href="https://rust-book.cs.brown.edu/" rel="noopener noreferrer"&gt;https://rust-book.cs.brown.edu/&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando Projeto
&lt;/h3&gt;

&lt;p&gt;Em nosso terminal, vamos criar o projeto usando o comando &lt;code&gt;cargo new binary_decimal&lt;/code&gt;, isso irá criar um novo programa em rust usando o &lt;a href="https://github.com/jotavetech/the-rust-book-ptbr/blob/main/02%20-%20Come%C3%A7ando/02%20-%20Hello%2C%20Cargo!.md" rel="noopener noreferrer"&gt;gerenciador de pacotes do Rust&lt;/a&gt;, que nos facilita na hora de criar programas ou fazer a sua build.&lt;/p&gt;

&lt;p&gt;Para rodar o programa, usamos &lt;code&gt;cargo run&lt;/code&gt; dentro da pasta criada.&lt;/p&gt;

&lt;p&gt;Após isso vamos acessar a nova pasta &lt;em&gt;binary_decimal&lt;/em&gt; que ele criou e vamos começar a escrever o nosso código dentro do arquivo &lt;em&gt;main.rs&lt;/em&gt; na pasta &lt;em&gt;src&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dentro do arquivo &lt;em&gt;main.rs&lt;/em&gt; você vai ver o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O programa em Rust sempre vai procurar a função principal &lt;code&gt;main&lt;/code&gt; para saber onde começa o seu código, tudo que fizermos vai começar dentro dela. Agora, no escopo da função &lt;code&gt;main&lt;/code&gt; temos o código &lt;code&gt;println!("Hello, world!");&lt;/code&gt;, um macro do Rust(não vamos nos aprofundar na diferença entre macros e funções.) que vai imprimir &lt;em&gt;Hello, world!&lt;/em&gt; na tela assim que você executar o programa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Escrevendo as Primeiras Linhas
&lt;/h3&gt;

&lt;p&gt;Primeiro, no topo do nosso arquivo &lt;em&gt;main.rs&lt;/em&gt; vamos importar um módulo da biblioteca padrão do Rust, que vai nos permitir ler entradas dos usuários:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//.....&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos escrever as nossas primeiras linhas do código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, escreva um número binário: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;binary_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;converted_numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.read_line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;binary_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Primeiro, chamamos o macro &lt;code&gt;println!&lt;/code&gt; para imprimir &lt;em&gt;"Olá, escreva um número binário:"&lt;/em&gt; no terminal, e em seguida com &lt;code&gt;let mut binary_number = String::new();&lt;/code&gt; criamos uma variável que poderá armazenar strings (textos) dinâmicas que podem crescer e diminuir de tamanho. Também usamos &lt;code&gt;let mut converted_numbers: Vec&amp;lt;i32&amp;gt; = Vec::new();&lt;/code&gt; para criar um vetor de tamanho dinâmico que armazena inteiros. Note que colocamos a palavra-chave &lt;code&gt;mut&lt;/code&gt; antes do nome da variável, isso diz ao Rust que ela pode e vai ser modificada mais pra frente no nosso código, já que variáveis são imutáveis por padrão em Rust.&lt;/p&gt;

&lt;p&gt;Na linha &lt;code&gt;io::stdin().read_line(&amp;amp;mut binary_number).unwrap();&lt;/code&gt; usamos método &lt;code&gt;read_line&lt;/code&gt; dentro do módulo &lt;code&gt;io&lt;/code&gt; para ler o que o usuário digitar no terminal, depois &lt;code&gt;(&amp;amp;mut binary_number)&lt;/code&gt; diz ao Rust para pegar o valor digitado no terminal e armazenar esse valor no endereço que memória que a variável &lt;code&gt;binary_number&lt;/code&gt; aponta, se o usuário digitar 10 então a variável &lt;code&gt;binary_number&lt;/code&gt; estará apontando para um endereço na memória com o valor 10.&lt;/p&gt;

&lt;h3&gt;
  
  
  Convertendo e Armazenando Valores Binários para Decimais
&lt;/h3&gt;

&lt;p&gt;Vamos adicionar mais algumas linhas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, escreva um número binário: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;binary_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;converted_numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.read_line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;binary_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;binary_number&lt;/span&gt;&lt;span class="nf"&gt;.trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.chars&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.rev&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'1'&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2_u32&lt;/span&gt;&lt;span class="nf"&gt;.pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;converted_numbers&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como aprendemos no começo, cada digito em um número binário possuí uma posição, que começa em 0 da esquerda para a direita, então criamos a variável &lt;code&gt;pos&lt;/code&gt; que será iniciada em 0 e servirá como controle da posição em que estivermos olhando para fazer a multiplicação.&lt;/p&gt;

&lt;p&gt;Após isso criamos um loop que passará por todos os caracteres armazenados na variável &lt;code&gt;binary_number&lt;/code&gt;, como precisamos cuidar disso de trás pra frente usamos o método &lt;code&gt;.rev()&lt;/code&gt; para inverter a string, também usamos o método &lt;code&gt;.chars()&lt;/code&gt; para dizer que queremos lidar com os &lt;em&gt;caracteres&lt;/em&gt; da string, e o método &lt;code&gt;.trim()&lt;/code&gt; para remover os espaços em branco da string, que são adicionados quando clicamos enter para enviar, já que é um caractere válido de escape mas não queremos ele pois causaria mais problemas.&lt;/p&gt;

&lt;p&gt;A cada caractere que passarmos no loop vamos verificar se ele é do valor &lt;code&gt;1&lt;/code&gt;, usando &lt;code&gt;if binary == '1'&lt;/code&gt; e, caso seja, então vamos fazer o nosso calculo multiplicando 1 * 2 elevado a posição em que o número está, que é controlada pela variável &lt;code&gt;pos&lt;/code&gt;, fazemos isso armazenando o resultado em uma variável &lt;code&gt;result&lt;/code&gt; fazendo a elevação com o método &lt;code&gt;pow()&lt;/code&gt; com&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;let result = 1 * 2_u32.pow(pos);`. Precisamos guardar os valores em algum lugar, já que no final de tudo precisamos somar todos os resultados para ter o nosso valor em decimal, então na linha `converted_numbers.push(result);`armazenamos o resultado da operação no nosso vetor`converted_numbers`, e, logo após, incrementamos a variável `pos`com`pos += 1;&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
 para termos o valor da próxima posição, que aumenta de 1 em 1.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;p&gt;Se o usuário digitar 1011, vamos fazer o loop de trás para frente. Na primeira iteração, o valor será 1 e a posição será 0. Assim, será multiplicado 1 por 2 elevado a 0, resultando em 1, que será armazenado. Em seguida, incrementamos o valor da posição em 1 e avançamos para a próxima iteração, onde o valor 1 será novamente 1 e a posição será 1, resultando em 1 multiplicado por 2 elevado a 1. Novamente, incrementamos a posição, chegando à terceira iteração, onde o valor é 0 e a posição é 2. Nessa etapa, teremos 0 multiplicado por 2 elevado a 2. Esse processo continua até percorrer todos os dígitos fornecidos pelo usuário, calculando o valor decimal correspondente à representação binária.&lt;/p&gt;
&lt;h3&gt;
  
  
  Somando os Valores Armazenados e Imprimindo na Tela
&lt;/h3&gt;

&lt;p&gt;Escrevendo o resto do nosso código, a versão final ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá, escreva um número binário: "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;binary_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;converted_numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.read_line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;binary_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;binary_number&lt;/span&gt;&lt;span class="nf"&gt;.trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.chars&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.rev&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;binary&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'1'&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2_u32&lt;/span&gt;&lt;span class="nf"&gt;.pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;converted_numbers&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;decimal_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;convert_to_decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;converted_numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"O número binário {} em decimal é {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;binary_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decimal_number&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;convert_to_decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="nf"&gt;.clone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Primeiro, criamos fora da função &lt;code&gt;main&lt;/code&gt;, uma nova função chamada &lt;code&gt;convert_to_decimal&lt;/code&gt; que receberá um parâmetro chamado &lt;code&gt;numbers&lt;/code&gt; que recebe uma referência a um vetor de inteiros.&lt;/p&gt;

&lt;p&gt;Em &lt;code&gt;(numbers: &amp;amp;mut Vec&amp;lt;u32&amp;gt;)&lt;/code&gt; dizemos o tipo do parâmetro e na parte &lt;code&gt;-&amp;gt; u32&lt;/code&gt; dizemos o que a função deverá retornar, no nosso caso, um inteiro.&lt;/p&gt;

&lt;p&gt;Dentro da nova função criamos uma variável &lt;code&gt;result&lt;/code&gt; que ficará responsável com o nosso calculo de todos os valores armazenados dentro do vetor que recebemos, para fazer isso iteramos sobre todos os números dentro de &lt;code&gt;numbers&lt;/code&gt; com um loop, somando o valor da iteração atual com o valor de &lt;code&gt;result&lt;/code&gt;, assim: &lt;code&gt;result += number.clone();&lt;/code&gt;. O método &lt;code&gt;.clone()&lt;/code&gt; faz com que o número seja copiado para result e não passe a sua referencia para o lugar em que está armazenado no valor, evitando bugs, e alterações indesejadas.&lt;/p&gt;

&lt;p&gt;Por fim, criamos a variável &lt;code&gt;decimal_number&lt;/code&gt; que recebe o resultado da função &lt;code&gt;convert_to_decimal&lt;/code&gt; que recebe como argumento a referência do vetor que queremos iterar. &lt;code&gt;let decimal_number = convert_to_decimal(&amp;amp;mut converted_numbers);&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora &lt;code&gt;decimal_number&lt;/code&gt; tem o resultado do número convertido para decimal e imprimimos isso na tela com o macro &lt;code&gt;println!&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"O número binário {} em decimal é {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;binary_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decimal_number&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/jotavetech/tech4all/tree/main/binary_decimal" rel="noopener noreferrer"&gt;Código Final&lt;/a&gt; Aqui está o código final do artigo de hoje!&lt;/p&gt;

&lt;h2&gt;
  
  
  FIM!
&lt;/h2&gt;

&lt;p&gt;Esse é o primeiro artigo que eu faço, espero que tenham gostado e aprendido algo novo, estou sempre aberto para sugestões e dicas em que posso melhorar &amp;lt;3&lt;/p&gt;

&lt;p&gt;Se curtiu, tenho alguns links que possam interessar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jotavetech/the-rust-book-ptbr" rel="noopener noreferrer"&gt;The Rust Book PT-BR&lt;/a&gt;, essa é a versão traduzida do livro oficial de Rust, tento simplificar e traduzir pra poder aumentar um pouco do público que quer aprender essa linguagem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jotavetech/tech4all" rel="noopener noreferrer"&gt;tech4all&lt;/a&gt; Meu repositório onde pretendo guardar os códigos que escrevo nos artigos, como esse. Lá você pode encontrar esse conversor também!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jotavetech/tech4all/tree/main/binary_decimal" rel="noopener noreferrer"&gt;Código Final&lt;/a&gt; Aqui está o código final do artigo de hoje!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marco.uminho.pt/~joao/Computacao2/node6.html" rel="noopener noreferrer"&gt;Binário para Decimal&lt;/a&gt; Aqui foi onde peguei a explicação sobre como converter binários para decimal.&lt;/p&gt;

&lt;p&gt;VALEU ❤️&lt;/p&gt;

</description>
      <category>rust</category>
      <category>tutorial</category>
      <category>documentation</category>
      <category>algorithms</category>
    </item>
  </channel>
</rss>
