<?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: Marcos Fernandes</title>
    <description>The latest articles on DEV Community by Marcos Fernandes (@marcosfernandesdev).</description>
    <link>https://dev.to/marcosfernandesdev</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%2F3191708%2F730e6ec6-d098-4c82-9ab8-84ca7c3f90c4.jpg</url>
      <title>DEV Community: Marcos Fernandes</title>
      <link>https://dev.to/marcosfernandesdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcosfernandesdev"/>
    <language>en</language>
    <item>
      <title>PostgreSQL: Dominando os Fundamentos da Administração de Banco de Dados</title>
      <dc:creator>Marcos Fernandes</dc:creator>
      <pubDate>Mon, 26 May 2025 17:51:45 +0000</pubDate>
      <link>https://dev.to/marcosfernandesdev/postgresql-dominando-os-fundamentos-da-administracao-de-banco-de-dados-5454</link>
      <guid>https://dev.to/marcosfernandesdev/postgresql-dominando-os-fundamentos-da-administracao-de-banco-de-dados-5454</guid>
      <description>&lt;p&gt;Quando você começa a trabalhar com PostgreSQL em ambiente de produção, rapidamente percebe que existe uma diferença significativa entre simplesmente usar o banco de dados e realmente administrá-lo. É como a diferença entre dirigir um carro e ser um mecânico - ambos são importantes, mas exigem conhecimentos completamente diferentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por Que o psql é Seu Melhor Amigo
&lt;/h2&gt;

&lt;p&gt;Embora existam excelentes interfaces gráficas para PostgreSQL, o cliente de linha de comando psql permanece como a ferramenta fundamental que todo administrador deve dominar. Pense no psql como o canivete suíço do PostgreSQL - ele sempre está disponível, funciona em qualquer ambiente e oferece acesso direto a todas as funcionalidades do banco.&lt;/p&gt;

&lt;p&gt;O psql vem com uma rica coleção de meta-comandos, que são atalhos que começam com barra invertida. Por exemplo, o comando &lt;code&gt;\s&lt;/code&gt; mostra seu histórico de comandos, enquanto &lt;code&gt;\l&lt;/code&gt; lista todos os bancos de dados. Esses comandos são como atalhos de teclado em um editor de texto - uma vez que você os aprende, sua produtividade aumenta exponencialmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração: O Coração do Desempenho
&lt;/h2&gt;

&lt;p&gt;Um dos aspectos mais críticos da administração PostgreSQL é entender como modificar o arquivo de configuração postgresql.conf. Imagine este arquivo como o painel de controle do seu banco de dados, onde cada parâmetro ajusta um comportamento específico.&lt;/p&gt;

&lt;p&gt;Um exemplo prático é a configuração da extensão pg_stat_statements através do parâmetro shared_preload_libraries. Esta extensão é como um sistema de monitoramento interno que coleta estatísticas sobre todas as consultas executadas no banco. É fundamental para identificar gargalos de performance, mas requer reinicialização do PostgreSQL para ser ativada.&lt;/p&gt;

&lt;p&gt;A diferença entre parâmetros que exigem reinicialização versus aqueles que podem ser recarregados é crucial em produção. Parâmetros que requerem apenas um reload são como ajustar o volume do rádio enquanto dirige, enquanto aqueles que precisam de restart são como parar o carro para trocar o óleo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observabilidade: Enxergando o Invisível
&lt;/h2&gt;

&lt;p&gt;PostgreSQL oferece uma janela para seu funcionamento interno através dos catálogos do sistema, especialmente pg_stat_activity e pg_locks. Estes catálogos são como painéis de instrumentos que mostram o que está acontecendo em tempo real.&lt;/p&gt;

&lt;p&gt;O pg_stat_activity revela todas as consultas ativas, seus usuários, duração e estado. É como ter uma câmera de segurança mostrando toda a atividade do banco. Já o pg_locks mostra conflitos de bloqueio, que são situações onde uma operação precisa aguardar outra terminar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerenciamento de Locks: O Desafio da Concorrência
&lt;/h2&gt;

&lt;p&gt;O sistema de locks do PostgreSQL é baseado em pessimismo controlado - ele assume que conflitos podem acontecer e protege os dados antecipadamente. É como um sistema de semáforos em um cruzamento movimentado, garantindo que apenas uma direção passe por vez.&lt;/p&gt;

&lt;p&gt;Existem locks compartilhados (que permitem leitura simultânea) e exclusivos (que bloqueiam tudo). Entender quando cada tipo é usado ajuda a prever e resolver problemas de bloqueio antes que afetem os usuários.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experimentação Segura: Aprendendo Sem Riscos
&lt;/h2&gt;

&lt;p&gt;Uma característica única do PostgreSQL é o DDL transacional - a capacidade de fazer mudanças estruturais dentro de transações que podem ser desfeitas. Isso permite experimentar com segurança, como ter um botão "desfazer" para mudanças no banco de dados.&lt;/p&gt;

&lt;p&gt;Contudo, a experimentação em produção deve ser feita com extremo cuidado. A criação de usuários somente leitura e o uso de ambientes de staging são práticas essenciais para manter a segurança dos dados de produção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Construindo uma Base Sólida
&lt;/h2&gt;

&lt;p&gt;Dominar estes fundamentos de administração PostgreSQL é como construir uma casa - você precisa de uma fundação sólida antes de adicionar os acabamentos. Cada conceito se conecta com os outros: o psql fornece as ferramentas, a configuração ajusta o comportamento, a observabilidade mostra os resultados, e o entendimento de locks previne problemas.&lt;/p&gt;

&lt;p&gt;O caminho para se tornar um administrador PostgreSQL competente passa necessariamente por estes fundamentos. Eles formam a base sobre a qual todo conhecimento avançado será construído, permitindo não apenas reagir a problemas, mas antecipá-los e preveni-los.&lt;/p&gt;

&lt;p&gt;Lembre-se: administração de banco de dados é tanto arte quanto ciência. Os conceitos técnicos são importantes, mas a experiência prática e o entendimento dos padrões de uso da sua aplicação são igualmente valiosos.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Active Record: O Coração dos Modelos no Rails</title>
      <dc:creator>Marcos Fernandes</dc:creator>
      <pubDate>Fri, 23 May 2025 16:56:09 +0000</pubDate>
      <link>https://dev.to/marcosfernandesdev/active-record-o-coracao-dos-modelos-no-rails-2gdp</link>
      <guid>https://dev.to/marcosfernandesdev/active-record-o-coracao-dos-modelos-no-rails-2gdp</guid>
      <description>&lt;p&gt;O Active Record é uma das joias da coroa do framework Ruby on Rails, funcionando como a camada de mapeamento objeto-relacional (ORM) que conecta os objetos da sua aplicação com as tabelas do banco de dados. Neste post, vamos explorar como o Active Record simplifica o trabalho com dados e permite que você se concentre na lógica de negócio em vez de escrever SQL manualmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o Active Record?
&lt;/h2&gt;

&lt;p&gt;O Active Record implementa o padrão de mesmo nome criado por Martin Fowler, onde objetos incluem tanto os dados quanto o comportamento que atua sobre esses dados. No Rails, cada classe de modelo corresponde a uma tabela no banco de dados, e cada instância dessa classe representa uma linha específica na tabela.&lt;/p&gt;

&lt;p&gt;Uma das belezas do Active Record é sua convenção sobre configuração. Ao seguir convenções de nomenclatura simples, ele consegue automaticamente inferir relações entre tabelas e mapear colunas para atributos de objetos sem necessidade de configuração adicional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo Seus Dados
&lt;/h2&gt;

&lt;p&gt;No Active Record, você não precisa declarar explicitamente os atributos dos seus modelos. Ao invés disso, o Rails utiliza introspecção para determinar as colunas da tabela e criar getters e setters automaticamente. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com apenas essa definição, você já tem acesso a todos os atributos da tabela &lt;code&gt;pedidos&lt;/code&gt;. O Rails assume que classes no singular correspondem a tabelas no plural, e automaticamente mapeia &lt;code&gt;Pedido&lt;/code&gt; para a tabela &lt;code&gt;pedidos&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Relacionamentos entre Modelos
&lt;/h2&gt;

&lt;p&gt;O Active Record suporta três tipos de relacionamentos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Um-para-um&lt;/strong&gt;: Implementado com &lt;code&gt;has_one&lt;/code&gt; e &lt;code&gt;belongs_to&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Um-para-muitos&lt;/strong&gt;: Implementado com &lt;code&gt;has_many&lt;/code&gt; e &lt;code&gt;belongs_to&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Muitos-para-muitos&lt;/strong&gt;: Implementado com &lt;code&gt;has_and_belongs_to_many&lt;/code&gt; ou através de um modelo de junção&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por exemplo, para definir que um pedido pode ter vários itens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:itens_pedido&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ItemPedido&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:pedido&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Operações CRUD
&lt;/h2&gt;

&lt;p&gt;O Active Record simplifica as operações de CRUD (Create, Read, Update, Delete):&lt;/p&gt;

&lt;h3&gt;
  
  
  Create (Criar)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pedido&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="ss"&gt;cliente: &lt;/span&gt;&lt;span class="s2"&gt;"João Silva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;email: &lt;/span&gt;&lt;span class="s2"&gt;"joao@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;
&lt;span class="c1"&gt;# ou&lt;/span&gt;
&lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;cliente: &lt;/span&gt;&lt;span class="s2"&gt;"João Silva"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;email: &lt;/span&gt;&lt;span class="s2"&gt;"joao@exemplo.com"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Read (Ler)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Encontra pelo ID&lt;/span&gt;
&lt;span class="n"&gt;pedidos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;cliente: &lt;/span&gt;&lt;span class="s2"&gt;"João Silva"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Encontra pela condição&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Update (Atualizar)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cliente&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Maria Silva"&lt;/span&gt;
&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;
&lt;span class="c1"&gt;# ou&lt;/span&gt;
&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;cliente: &lt;/span&gt;&lt;span class="s2"&gt;"Maria Silva"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Delete (Excluir)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;
&lt;span class="c1"&gt;# ou&lt;/span&gt;
&lt;span class="no"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Consultas Avançadas
&lt;/h2&gt;

&lt;p&gt;O Active Record oferece uma API fluente para consultas que vai muito além do básico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Encontra pedidos recentes, ordenados por data&lt;/span&gt;
&lt;span class="n"&gt;pedidos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"created_at &amp;gt; ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;days&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;created_at: :desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
               &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Callbacks e Ciclo de Vida
&lt;/h2&gt;

&lt;p&gt;Um dos recursos mais poderosos do Active Record são os callbacks, que permitem executar código em momentos específicos do ciclo de vida dos objetos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;before_save&lt;/span&gt; &lt;span class="ss"&gt;:normalizar_telefone&lt;/span&gt;
  &lt;span class="n"&gt;after_create&lt;/span&gt; &lt;span class="ss"&gt;:enviar_email_confirmacao&lt;/span&gt;

  &lt;span class="kp"&gt;private&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;normalizar_telefone&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;telefone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;telefone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/\D/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&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;telefone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;enviar_email_confirmacao&lt;/span&gt;
    &lt;span class="no"&gt;PedidoMailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;confirmacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;deliver_later&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Transações
&lt;/h2&gt;

&lt;p&gt;Para operações que precisam ser atômicas, o Active Record suporta transações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Conta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;conta1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;depositar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;conta2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sacar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se qualquer parte da transação falhar (por exemplo, se &lt;code&gt;conta2&lt;/code&gt; não tiver saldo suficiente), toda a operação será revertida, garantindo a consistência dos dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O Active Record é uma abstração poderosa que simplifica enormemente o trabalho com bancos de dados nas aplicações Rails. Ele elimina muito do código clichê normalmente associado ao acesso a dados e permite que você se concentre no que realmente importa: a lógica de negócio da sua aplicação.&lt;/p&gt;

&lt;p&gt;À medida que você se torna mais familiar com o Active Record, descobrirá que pode expressar consultas complexas de maneira elegante e legível, sem sacrificar a eficiência. E quando precisar, sempre é possível recorrer ao SQL puro para casos específicos.&lt;/p&gt;

&lt;p&gt;Que tal compartilhar nos comentários como você tem usado o Active Record nos seus projetos? Você tem alguma dica ou truque interessante para simplificar ainda mais o trabalho com dados no Rails?&lt;/p&gt;

</description>
      <category>rails</category>
    </item>
    <item>
      <title>A Arte dos Métodos em Ruby: Dominando a Base da Linguagem</title>
      <dc:creator>Marcos Fernandes</dc:creator>
      <pubDate>Wed, 21 May 2025 13:51:08 +0000</pubDate>
      <link>https://dev.to/marcosfernandesdev/a-arte-dos-metodos-em-ruby-dominando-a-base-da-linguagem-n28</link>
      <guid>https://dev.to/marcosfernandesdev/a-arte-dos-metodos-em-ruby-dominando-a-base-da-linguagem-n28</guid>
      <description>&lt;p&gt;Quando estamos aprendendo Ruby, rapidamente percebemos como os métodos são fundamentais para a estrutura da linguagem. Diferente de outras linguagens de programação, Ruby trata métodos com uma elegância singular, oferecendo diversas formas de defini-los e chamá-los. Vamos explorar em detalhes como funcionam os métodos em Ruby e algumas técnicas avançadas que podem elevar seu código a um novo patamar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo Métodos: A Base de Tudo
&lt;/h2&gt;

&lt;p&gt;Em Ruby, definimos métodos usando a palavra-chave &lt;code&gt;def&lt;/code&gt;. O corpo do método contém expressões Ruby normais, e o valor de retorno é o resultado da última expressão executada (ou o argumento de um &lt;code&gt;return&lt;/code&gt; explícito).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;saudacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="s2"&gt;"Olá, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;saudacao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Imprime: Olá, Maria!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma característica interessante é que podemos redefinir um método sem erros - Ruby apenas emite um aviso e usa a segunda definição. Isso, combinado com a capacidade de reabrir classes, permite modificar comportamentos em tempo de execução.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Evolução dos Métodos: Ruby 2 vs. Ruby 3 vs. Ruby 3.4
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ruby 2: A Era dos Argumentos Ambíguos
&lt;/h3&gt;

&lt;p&gt;No Ruby 2.x, os argumentos de palavra-chave (keyword arguments) eram tratados internamente como um hash opcional no final da lista de argumentos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby 2.x&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;buscar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;campo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opcoes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
  &lt;span class="c1"&gt;# opcoes é um hash contendo os parâmetros de palavra-chave&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Buscando em &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;campo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; com &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;opcoes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Ambas as chamadas eram tratadas da mesma forma&lt;/span&gt;
&lt;span class="n"&gt;buscar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:titulo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;genero: &lt;/span&gt;&lt;span class="s2"&gt;"jazz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;duracao_menor_que: &lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;buscar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:titulo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;genero: &lt;/span&gt;&lt;span class="s2"&gt;"jazz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;duracao_menor_que: &lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta abordagem era conveniente, mas criava ambiguidades e dificultava a distinção entre um hash regular e argumentos de palavra-chave verdadeiros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ruby 3.0: A Separação Completa de Argumentos
&lt;/h3&gt;

&lt;p&gt;Ruby 3.0 introduziu uma mudança fundamental: a separação completa entre argumentos posicionais e argumentos de palavra-chave. Esta não foi apenas uma mudança sintática, mas uma alteração importante no comportamento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby 3.0+&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;buscar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;campo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opcoes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Buscando em &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;campo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; com &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;opcoes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Isso funciona - opcoes recebe o hash&lt;/span&gt;
&lt;span class="n"&gt;buscar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:titulo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;genero: &lt;/span&gt;&lt;span class="s2"&gt;"jazz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;duracao_menor_que: &lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Isso gera um ArgumentError em Ruby 3.0!&lt;/span&gt;
&lt;span class="c1"&gt;# Ruby não converte mais automaticamente os keywords em hash&lt;/span&gt;
&lt;span class="n"&gt;buscar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:titulo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;genero: &lt;/span&gt;&lt;span class="s2"&gt;"jazz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;duracao_menor_que: &lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para manter a compatibilidade com o estilo anterior, você precisa usar o operador de duplo splat para capturar keywords explicitamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby 3.0+ - forma correta&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;buscar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;campo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;opcoes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Buscando em &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;campo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; com &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;opcoes&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Agora funciona corretamente&lt;/span&gt;
&lt;span class="n"&gt;buscar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:titulo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;genero: &lt;/span&gt;&lt;span class="s2"&gt;"jazz"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;duracao_menor_que: &lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ruby 3.0 também introduziu a sintaxe de "método sem fim" (endless method):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby 3.0+ - método sem fim&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quadrado&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E a sintaxe de reticências triplas para encaminhar todos os argumentos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby 3.0+ - encaminhamento de argumentos&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;metodo_intermediario&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="n"&gt;metodo_final&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="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ruby 3.2-3.4: Refinamentos em Parâmetros e Padrões
&lt;/h3&gt;

&lt;p&gt;Ruby 3.2 introduziu os parâmetros de dados, permitindo desestruturar argumentos diretamente na definição do método:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby 3.2+&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;processa_usuario&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;:)&lt;/span&gt;
  &lt;span class="c1"&gt;# Desestruturação do objeto usuário&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="ss"&gt;idade: &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;
  &lt;span class="s2"&gt;"Nome: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, Idade: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ruby 3.4 aprimorou a inferência de tipos e melhorou o pattern matching nos parâmetros de métodos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ruby 3.4+&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;processar_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;
  &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upcase&lt;/span&gt;
  &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;Integer&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&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="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;"Tipo desconhecido"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Migração e Compatibilidade
&lt;/h2&gt;

&lt;p&gt;Se você estiver migrando código de Ruby 2.x para Ruby 3.x, especialmente em relação aos argumentos de método, aqui estão algumas dicas importantes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Use a flag &lt;code&gt;-W:deprecated&lt;/code&gt; para identificar código que usa o comportamento antigo de argumentos de palavra-chave.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Declare explicitamente parâmetros de palavra-chave usando a sintaxe &lt;code&gt;parametro:&lt;/code&gt; ou &lt;code&gt;**kwargs&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Para métodos que precisam manter compatibilidade com versões mais antigas, considere:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Compatível com Ruby 2.7+ e 3.0+&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;metodo_compativel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;outro_metodo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Ao chamar métodos de bibliotecas que foram escritas antes do Ruby 3.0, você pode precisar converter explicitamente keyword arguments em hashes usando o operador &lt;code&gt;**{}&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Forçando keywords a serem tratados como hash&lt;/span&gt;
&lt;span class="n"&gt;metodo_antigo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:valor&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="ss"&gt;opcao1: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;opcao2: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Nomes de Métodos: Convenções Importantes
&lt;/h2&gt;

&lt;p&gt;Os nomes de métodos em Ruby devem começar com letra minúscula ou underscore, seguido por uma combinação de letras, dígitos e underscores. Por convenção, os métodos que retornam valores booleanos (predicados) geralmente terminam com &lt;code&gt;?&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;even?&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;even?&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Métodos "perigosos" ou que modificam o objeto receptor costumam terminar com exclamação &lt;code&gt;!&lt;/code&gt;. Estes são frequentemente emparelhados com uma versão "segura" sem a exclamação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"meu código"&lt;/span&gt;
&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chop&lt;/span&gt;   &lt;span class="c1"&gt;# =&amp;gt; "meu códig" (retorna uma cópia modificada)&lt;/span&gt;
&lt;span class="n"&gt;texto&lt;/span&gt;        &lt;span class="c1"&gt;# =&amp;gt; "meu código" (original permanece inalterado)&lt;/span&gt;
&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chop!&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; "meu códig" (modifica o objeto original)&lt;/span&gt;
&lt;span class="n"&gt;texto&lt;/span&gt;        &lt;span class="c1"&gt;# =&amp;gt; "meu códig" (o objeto foi modificado)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Métodos que podem aparecer no lado esquerdo de uma atribuição terminam com sinal de igual &lt;code&gt;=&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;novo_nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;novo_nome&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Ana Vitória"&lt;/span&gt; &lt;span class="c1"&gt;# Invoca o método nome=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O Receptor do Método: Self e Além
&lt;/h2&gt;

&lt;p&gt;Em Ruby, cada método é chamado em um objeto receptor. Dentro do método, a palavra-chave &lt;code&gt;self&lt;/code&gt; refere-se a esse receptor.&lt;/p&gt;

&lt;p&gt;Podemos definir métodos para classes (métodos de classe) prefixando o nome do método com &lt;code&gt;self.&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Computador&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;funcao&lt;/span&gt;
    &lt;span class="s2"&gt;"Receio não poder fazer isso"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;Computador&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;funcao&lt;/span&gt; &lt;span class="c1"&gt;# Chama o método na própria classe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também podemos anexar métodos a objetos específicos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;mac&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Computador&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;mac&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;introducao&lt;/span&gt;
  &lt;span class="s2"&gt;"Eu sou um Mac"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;mac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;introducao&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Eu sou um Mac"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Parâmetros de Método: Flexibilidade em Ação
&lt;/h2&gt;

&lt;p&gt;Ruby oferece várias formas de definir parâmetros, tornando os métodos extremamente flexíveis:&lt;/p&gt;

&lt;h3&gt;
  
  
  Parâmetros com Valores Padrão
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;musico_favorito&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Chico"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Elis"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Caetano"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;."&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;musico_favorito&lt;/span&gt;                    &lt;span class="c1"&gt;# =&amp;gt; "Chico, Elis, Caetano."&lt;/span&gt;
&lt;span class="n"&gt;musico_favorito&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Milton"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# =&amp;gt; "Milton, Elis, Caetano."&lt;/span&gt;
&lt;span class="n"&gt;musico_favorito&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Milton"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Milton, Maria, Caetano."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parâmetros de Tamanho Variável (Splat)
&lt;/h3&gt;

&lt;p&gt;Usando um asterisco antes do nome do parâmetro, podemos capturar múltiplos argumentos em um único array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;argumentos_variaveis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;resto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="s2"&gt;"arg1=&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; -- resto=&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;resto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;argumentos_variaveis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"um"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                 &lt;span class="c1"&gt;# =&amp;gt; arg1=um -- resto=[]&lt;/span&gt;
&lt;span class="n"&gt;argumentos_variaveis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"um"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"dois"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"três"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; arg1=um -- resto=["dois", "três"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parâmetros de Palavra-chave (Keyword Parameters)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;metodo_com_keywords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;cep&lt;/span&gt;&lt;span class="p"&gt;:)&lt;/span&gt;
  &lt;span class="s2"&gt;"Moro em &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;cep&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;metodo_com_keywords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;cidade: &lt;/span&gt;&lt;span class="s2"&gt;"São Paulo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;estado: &lt;/span&gt;&lt;span class="s2"&gt;"SP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;cep: &lt;/span&gt;&lt;span class="s2"&gt;"01311-000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; "Moro em São Paulo, SP 01311-000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos também coletar palavras-chave arbitrárias usando o operador de duplo splat &lt;code&gt;**&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;varargs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;resto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="s2"&gt;"arg1=&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. resto=&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;resto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inspect&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;varargs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"um"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;cor: &lt;/span&gt;&lt;span class="s2"&gt;"vermelho"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;tamanho: &lt;/span&gt;&lt;span class="s2"&gt;"G"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; arg1=um. resto={:cor=&amp;gt;"vermelho", :tamanho=&amp;gt;"G"}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Chamando Métodos: A Execução em Prática
&lt;/h2&gt;

&lt;p&gt;Para chamar um método, você especifica (opcionalmente) um receptor, o nome do método e os argumentos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;arquivo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;download_mp3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"samba"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;velocidade: :normal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;mostrar_progresso&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;p&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;Se omitirmos o receptor, Ruby usa &lt;code&gt;self&lt;/code&gt; como receptor padrão. Isso é como os métodos privados funcionam - eles só podem ser chamados implicitamente no objeto atual.&lt;/p&gt;

&lt;p&gt;Uma observação importante: ao chamar um método no lado esquerdo de uma atribuição (com nome terminando em &lt;code&gt;=&lt;/code&gt;), você deve especificar explicitamente o receptor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;novo_nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;novo_nome&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;alterar_coisas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;novo_nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Isso cria uma variável local chamada 'nome'&lt;/span&gt;
    &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;novo_nome&lt;/span&gt;  

    &lt;span class="c1"&gt;# Para chamar o método, precisamos usar 'self'&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;novo_nome&lt;/span&gt;  
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Valores de Retorno: O Resultado Final
&lt;/h2&gt;

&lt;p&gt;Todo método retorna um valor - o valor da última expressão executada (ou o argumento de &lt;code&gt;return&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;positivo_ou_negativo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"positivo"&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="s2"&gt;"negativo"&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;"zero"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;positivo_ou_negativo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "positivo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode usar &lt;code&gt;return&lt;/code&gt; para sair do método prematuramente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encontrar_quadrado_grande&lt;/span&gt;
  &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;quadrado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quadrado&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;quadrado&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quadrado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;encontrar_quadrado_grande&lt;/span&gt;
&lt;span class="c1"&gt;# numero =&amp;gt; 32, quadrado =&amp;gt; 1024&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Expansão em Chamadas de Método (Splat)
&lt;/h2&gt;

&lt;p&gt;Assim como podemos coletar múltiplos argumentos em um array, podemos fazer o contrário - converter uma coleção em argumentos individuais usando o operador de splat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cinco&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="s2"&gt;"Recebi &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;cinco&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&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;# =&amp;gt; "Recebi 1 2 3 4 5"&lt;/span&gt;
&lt;span class="n"&gt;cinco&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&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="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&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;# =&amp;gt; "Recebi 1 2 3 4 5"&lt;/span&gt;
&lt;span class="n"&gt;cinco&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="mi"&gt;1&lt;/span&gt;&lt;span class="o"&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;# =&amp;gt; "Recebi 1 2 3 4 5"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Da mesma forma, podemos expandir hashes em argumentos de palavra-chave usando o duplo splat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;metodo_com_keywords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;cep&lt;/span&gt;&lt;span class="p"&gt;:)&lt;/span&gt;
  &lt;span class="s2"&gt;"Moro em &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;cidade&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;cep&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;dados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;cidade: &lt;/span&gt;&lt;span class="s2"&gt;"Recife"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;estado: &lt;/span&gt;&lt;span class="s2"&gt;"PE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;cep: &lt;/span&gt;&lt;span class="s2"&gt;"50030-150"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;metodo_com_keywords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Moro em Recife, PE 50030-150"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passando Blocos como Argumentos
&lt;/h2&gt;

&lt;p&gt;Uma técnica poderosa em Ruby é a capacidade de converter um objeto &lt;code&gt;Proc&lt;/code&gt; em um bloco para passá-lo a um método:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upcase&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; ["A", "B", "C"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existe um atalho muito usado com o operador &lt;code&gt;&amp;amp;&lt;/code&gt; quando o bloco apenas chama um método:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:upcase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; ["A", "B", "C"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso funciona porque a classe &lt;code&gt;Symbol&lt;/code&gt; implementa o método &lt;code&gt;to_proc&lt;/code&gt;, retornando um objeto &lt;code&gt;Proc&lt;/code&gt; que chama o método correspondente ao símbolo.&lt;/p&gt;

&lt;p&gt;Outra aplicação interessante é criar blocos dinamicamente e passá-los aos métodos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;"Operação ((m)ultiplicação ou (s)oma): "&lt;/span&gt;
&lt;span class="n"&gt;operador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;gets&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;"número: "&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;gets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;metodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operador&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_with?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"m"&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="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;:&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="nb"&gt;puts&lt;/span&gt;&lt;span class="p"&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;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão: O Poder dos Métodos em Ruby
&lt;/h2&gt;

&lt;p&gt;Os métodos em Ruby são muito mais do que simples funções. Eles formam a base da expressividade e flexibilidade que torna a linguagem tão querida por desenvolvedores em todo o mundo. Com recursos como parâmetros nomeados, expansão de coleções e integração com blocos, os métodos Ruby podem ser adaptados para uma ampla variedade de cenários de programação.&lt;/p&gt;

&lt;p&gt;A evolução dos métodos em Ruby, especialmente as mudanças entre as versões 2.x e 3.x, mostra o compromisso da linguagem com a clareza e precisão. Embora essas mudanças possam exigir ajustes ao migrar código antigo, elas resultam em um sistema de tipos mais robusto e menos propenso a erros sutis.&lt;/p&gt;

&lt;p&gt;Dominar a arte de definir e chamar métodos em Ruby é essencial para escrever código elegante, expressivo e de fácil manutenção. Ao compreender profundamente os conceitos apresentados neste artigo, você estará bem equipado para criar interfaces de programação intuitivas e poderosas em seus projetos Ruby.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Ruby Para Iniciantes: Entendendo Classes, Objetos e Variáveis</title>
      <dc:creator>Marcos Fernandes</dc:creator>
      <pubDate>Wed, 21 May 2025 13:49:23 +0000</pubDate>
      <link>https://dev.to/marcosfernandesdev/ruby-para-iniciantes-entendendo-classes-objetos-e-variaveis-4jf0</link>
      <guid>https://dev.to/marcosfernandesdev/ruby-para-iniciantes-entendendo-classes-objetos-e-variaveis-4jf0</guid>
      <description>&lt;p&gt;Ruby é uma linguagem dinâmica, elegante e poderosa, conhecida por sua sintaxe limpa e expressiva. Um dos aspectos mais importantes de Ruby é seu modelo de programação orientada a objetos, que permite estruturar códigos de forma intuitiva e eficiente. Neste artigo, vamos explorar os fundamentos de classes, objetos e variáveis em Ruby, desvendando a simplicidade e potência desses conceitos.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Base da Orientação a Objetos em Ruby
&lt;/h2&gt;

&lt;p&gt;Em Ruby, &lt;strong&gt;tudo é um objeto&lt;/strong&gt;. Esta não é apenas uma afirmação retórica - é um princípio fundamental da linguagem. Desde números e strings até as próprias classes, tudo em Ruby é instanciado a partir de uma classe. Esta característica proporciona uma consistência valiosa para quem está aprendendo a linguagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo Classes
&lt;/h2&gt;

&lt;p&gt;Vamos começar com um exemplo prático. Imagine que estamos gerenciando uma livraria de livros usados. Precisamos desenvolver um sistema que realize o controle de estoque, processando arquivos CSV que contêm informações como ISBN e preço dos livros.&lt;/p&gt;

&lt;p&gt;Uma boa abordagem para design orientado a objetos é identificar os conceitos do domínio. No nosso caso, um conceito fundamental é o livro em estoque. Podemos representá-lo com uma classe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BookInStock&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isbn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@isbn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isbn&lt;/span&gt;
    &lt;span class="vi"&gt;@price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta simples declaração já nos permite criar instâncias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;a_book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;BookInStock&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="s2"&gt;"isbn1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;another_book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;BookInStock&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="s2"&gt;"isbn2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O Método Initialize
&lt;/h2&gt;

&lt;p&gt;O método &lt;code&gt;initialize&lt;/code&gt; é especial em Ruby. Quando você chama &lt;code&gt;BookInStock.new&lt;/code&gt;, Ruby aloca memória para um objeto não inicializado e então chama o método &lt;code&gt;initialize&lt;/code&gt; desse objeto, passando todos os argumentos que foram passados para &lt;code&gt;new&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Isso permite configurar o estado inicial do objeto. No nosso exemplo, o método &lt;code&gt;initialize&lt;/code&gt; transfere os parâmetros para as variáveis de instância &lt;code&gt;@isbn&lt;/code&gt; e &lt;code&gt;@price&lt;/code&gt;. Note o símbolo &lt;code&gt;@&lt;/code&gt; - ele identifica variáveis de instância em Ruby, que são armazenadas com cada objeto e acessíveis em todos os métodos desse objeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetos e Atributos
&lt;/h2&gt;

&lt;p&gt;As variáveis de instância são encapsuladas nos objetos - são privadas por padrão. Isso é vantajoso, pois garante que o objeto seja responsável por manter sua própria consistência. Porém, precisamos definir métodos que permitam ao mundo exterior interagir com o objeto. Esses aspectos visíveis externamente são chamados de &lt;strong&gt;atributos&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Métodos de Acesso
&lt;/h3&gt;

&lt;p&gt;Ruby facilita a criação de métodos acessores através de atalhos convenientes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BookInStock&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:isbn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:price&lt;/span&gt;  &lt;span class="c1"&gt;# Cria métodos de leitura&lt;/span&gt;
  &lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:price&lt;/span&gt;       &lt;span class="c1"&gt;# Cria métodos de leitura e escrita&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isbn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@isbn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isbn&lt;/span&gt;
    &lt;span class="vi"&gt;@price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;code&gt;attr_reader&lt;/code&gt; cria métodos para leitura, enquanto &lt;code&gt;attr_accessor&lt;/code&gt; cria métodos para leitura e escrita. Isso permite acessar atributos de forma simples e elegante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;BookInStock&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="s2"&gt;"isbn1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;33.80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"ISBN = &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isbn&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;        &lt;span class="c1"&gt;# Lendo um atributo&lt;/span&gt;
&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;    &lt;span class="c1"&gt;# Modificando um atributo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Atributos São Apenas Métodos
&lt;/h2&gt;

&lt;p&gt;Um conceito fundamental em Ruby é que atributos são apenas métodos sem argumentos. Eles não necessariamente precisam apenas retornar ou atribuir valores a variáveis de instância. Você pode implementar lógica mais complexa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;price_in_cents&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;price_in_cents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cents&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria uma variável de instância "virtual". Para o mundo exterior, &lt;code&gt;price_in_cents&lt;/code&gt; parece ser um atributo como qualquer outro, mas internamente não possui variável de instância correspondente.&lt;/p&gt;

&lt;p&gt;Este princípio, conhecido como "Princípio do Acesso Uniforme", é poderoso - você oculta a implementação do resto do mundo, tendo liberdade para alterá-la no futuro sem impactar o código que utiliza sua classe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classes Trabalhando Juntas
&lt;/h2&gt;

&lt;p&gt;Resolver problemas complexos geralmente envolve múltiplas classes trabalhando juntas. No nosso exemplo da livraria, além da classe &lt;code&gt;BookInStock&lt;/code&gt;, podemos criar uma classe &lt;code&gt;CsvReader&lt;/code&gt; para processar os arquivos CSV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CsvReader&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;
    &lt;span class="vi"&gt;@books_in_stock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_in_csv_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv_file_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;CSV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv_file_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;headers: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="vi"&gt;@books_in_stock&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;BookInStock&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="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"ISBN"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Price"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;total_value_in_stock&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="vi"&gt;@books_in_stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;price&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta abordagem de dividir responsabilidades entre classes torna o código mais modular, legível e manutenível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controle de Acesso
&lt;/h2&gt;

&lt;p&gt;Ruby oferece três níveis de controle de acesso para métodos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Public&lt;/strong&gt;: Métodos acessíveis por qualquer código (padrão)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protected&lt;/strong&gt;: Métodos acessíveis apenas por objetos da mesma classe ou subclasses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private&lt;/strong&gt;: Métodos que só podem ser chamados no contexto do objeto atual&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Isso permite controlar quanta exposição sua classe terá ao mundo exterior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method1&lt;/span&gt;
    &lt;span class="c1"&gt;# Método público&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method2&lt;/span&gt;
    &lt;span class="c1"&gt;# Método protegido&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;private&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method3&lt;/span&gt;
    &lt;span class="c1"&gt;# Método privado&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Variáveis e Referências
&lt;/h2&gt;

&lt;p&gt;Em Ruby, variáveis não são objetos - são referências a objetos. Os objetos existem em um "pool" (geralmente a heap do sistema operacional) e são apontados por variáveis. Isso tem implicações importantes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;person1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Tim"&lt;/span&gt;
&lt;span class="n"&gt;person2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;person1&lt;/span&gt;    &lt;span class="c1"&gt;# Ambos apontam para o mesmo objeto&lt;/span&gt;
&lt;span class="n"&gt;person1&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="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'J'&lt;/span&gt;     &lt;span class="c1"&gt;# Modifica o objeto&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;person2&lt;/span&gt;         &lt;span class="c1"&gt;# Exibe "Jim", não "Tim"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se quiser evitar esse comportamento, você pode usar &lt;code&gt;dup&lt;/code&gt; para criar uma cópia do objeto, ou &lt;code&gt;freeze&lt;/code&gt; para impedir modificações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reabrindo Classes
&lt;/h2&gt;

&lt;p&gt;Uma característica única de Ruby é a capacidade de reabrir uma definição de classe e adicionar novos métodos ou variáveis a qualquer momento, mesmo para classes da biblioteca padrão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reverso_e_maiusculo&lt;/span&gt;
    &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upcase&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"teste"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reverso_e_maiusculo&lt;/span&gt;  &lt;span class="c1"&gt;# Imprime "ETSET"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa técnica, conhecida como "monkey patching", pode ser poderosa, mas deve ser usada com cautela para evitar comportamentos imprevisíveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O modelo de objetos em Ruby é simples, consistente e flexível, tornando a linguagem uma excelente escolha para programação orientada a objetos. A sintaxe expressiva e os atalhos convenientes permitem escrever código limpo e elegante, enquanto os conceitos sólidos de OO proporcionam uma base robusta para aplicações complexas.&lt;/p&gt;

&lt;p&gt;Se você está começando com Ruby ou buscando aprofundar seus conhecimentos em programação orientada a objetos, explorar esses conceitos fundamentais será um passo valioso na sua jornada de aprendizado.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Convenções de Nomenclatura no Ruby on Rails: A Magia por Trás do Code</title>
      <dc:creator>Marcos Fernandes</dc:creator>
      <pubDate>Wed, 21 May 2025 13:43:52 +0000</pubDate>
      <link>https://dev.to/marcosfernandesdev/convencoes-de-nomenclatura-no-ruby-on-rails-a-magia-por-tras-do-code-ai7</link>
      <guid>https://dev.to/marcosfernandesdev/convencoes-de-nomenclatura-no-ruby-on-rails-a-magia-por-tras-do-code-ai7</guid>
      <description>&lt;h2&gt;
  
  
  O que são as convenções de nomenclatura no Rails?
&lt;/h2&gt;

&lt;p&gt;Se você já começou a trabalhar com Ruby on Rails, provavelmente ficou surpreso com a forma como o framework lida automaticamente com a nomenclatura dos elementos. Por exemplo, quando você cria uma classe modelo chamada &lt;code&gt;Person&lt;/code&gt;, o Rails sabe que deve procurar por uma tabela de banco de dados chamada &lt;code&gt;people&lt;/code&gt;. Isso não é magia, mas sim convenções bem definidas que tornam o desenvolvimento mais fluido.&lt;/p&gt;

&lt;p&gt;As convenções de nomenclatura no Rails seguem um padrão chamado "convenção sobre configuração" (convention over configuration), o que significa que, ao seguir essas convenções, você escreve menos código e ganha mais produtividade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mixed Case, Underscores e Plurais
&lt;/h2&gt;

&lt;p&gt;No Ruby, tradicionalmente, as variáveis são nomeadas usando letras minúsculas com palavras separadas por underscores (como &lt;code&gt;order_status&lt;/code&gt;). Já as classes e módulos seguem o padrão Mixed Case, onde cada palavra na frase é capitalizada sem underscores (como &lt;code&gt;LineItem&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;O Rails estende essas convenções de duas maneiras importantes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Nomes de tabelas no banco de dados&lt;/strong&gt;: Seguem o padrão de letras minúsculas com underscores, assim como as variáveis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pluralização automática&lt;/strong&gt;: Tabelas são sempre nomeadas no plural. Por exemplo, uma classe modelo &lt;code&gt;Product&lt;/code&gt; corresponde a uma tabela &lt;code&gt;products&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Por que usar plurais para as tabelas?
&lt;/h2&gt;

&lt;p&gt;Como explicado por David no documento, isso faz sentido na conversação natural. Quando dizemos "Selecione um Produto de produtos" ou "Um pedido tem muitos itens", a linguagem flui naturalmente.&lt;/p&gt;

&lt;p&gt;A intenção é criar uma linguagem de domínio que possa ser compartilhada entre programadores e não-programadores, reduzindo a tradução mental que geralmente ocorre nas discussões técnicas com clientes. Quando um cliente fala sobre "descrição do produto", mas no código está implementado como "corpo da mercadoria", surgem lacunas de comunicação que podem levar a erros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefícios de seguir as convenções
&lt;/h2&gt;

&lt;p&gt;O Rails recompensa os desenvolvedores que seguem suas convenções padrão com configuração automática. Isso significa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menos código para escrever&lt;/li&gt;
&lt;li&gt;Menos configuração manual&lt;/li&gt;
&lt;li&gt;Maior produtividade&lt;/li&gt;
&lt;li&gt;Código mais consistente e legível para toda a equipe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Embora seja possível sobrescrever essas convenções usando opções de configuração, fazê-lo significa abrir mão dos benefícios automáticos que o framework oferece.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;As convenções de nomenclatura do Rails podem parecer estranhas no início, mas elas foram cuidadosamente projetadas para aumentar a produtividade e melhorar a comunicação entre todas as partes envolvidas no desenvolvimento. Uma vez que você se acostuma com elas, torna-se natural e você começa a apreciar como elas simplificam seu trabalho.&lt;/p&gt;

&lt;p&gt;Se você está começando com Rails, meu conselho é: resista à tentação de "fazer do seu jeito" e abrace as convenções. A produtividade que você ganhará vale o pequeno ajuste inicial.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>rails</category>
    </item>
    <item>
      <title>Ruby: Uma Linguagem Puramente Orientada a Objetos</title>
      <dc:creator>Marcos Fernandes</dc:creator>
      <pubDate>Wed, 21 May 2025 13:37:01 +0000</pubDate>
      <link>https://dev.to/marcosfernandesdev/ruby-uma-linguagem-puramente-orientada-a-objetos-225n</link>
      <guid>https://dev.to/marcosfernandesdev/ruby-uma-linguagem-puramente-orientada-a-objetos-225n</guid>
      <description>&lt;p&gt;Ruby é frequentemente descrita como uma linguagem elegante, expressiva e com uma sintaxe que prioriza a legibilidade e produtividade do desenvolvedor. Mas o que realmente destaca Ruby no universo das linguagens de programação é seu compromisso total com o paradigma orientado a objetos. Vamos explorar o que isso significa e como isso molda a experiência de programação em Ruby.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tudo em Ruby é um Objeto
&lt;/h2&gt;

&lt;p&gt;Diferentemente de outras linguagens que se dizem orientadas a objetos como Java, JavaScript e Python, em Ruby &lt;strong&gt;absolutamente tudo é um objeto&lt;/strong&gt;. Não existem tipos primitivos ou básicos que se comportam de maneira diferente.&lt;/p&gt;

&lt;p&gt;Números, strings, booleanos, até mesmo o valor &lt;code&gt;nil&lt;/code&gt; (equivalente ao &lt;code&gt;null&lt;/code&gt; de outras linguagens) - todos são objetos completos com seus próprios métodos e comportamentos. Isso significa que você pode fazer algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;    &lt;span class="c1"&gt;# =&amp;gt; 1234&lt;/span&gt;
&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;even?&lt;/span&gt;     &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;
&lt;span class="s2"&gt;"ruby"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa consistência é o que torna Ruby uma linguagem &lt;em&gt;puramente&lt;/em&gt; orientada a objetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classes e Instâncias em Ruby
&lt;/h2&gt;

&lt;p&gt;Em Ruby, você define uma classe para representar um conceito ou categoria. Imagine que estamos criando um sistema para uma jukebox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Song&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;play&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Tocando a música &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;song1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Song&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="s2"&gt;"Ruby Tuesday"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;song2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Song&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="s2"&gt;"Enveloped in Python"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;song1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: Tocando a música Ruby Tuesday&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada instância tem seu próprio estado (guardado em variáveis de instância como &lt;code&gt;@name&lt;/code&gt;), mas compartilha o comportamento definido na classe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxe Limpa e Descomplicada
&lt;/h2&gt;

&lt;p&gt;Ruby foi projetada para ter uma sintaxe concisa e natural:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sem necessidade de ponto e vírgula no final das linhas&lt;/li&gt;
&lt;li&gt;Parênteses são opcionais em chamadas de método (embora recomendados em casos menos simples)&lt;/li&gt;
&lt;li&gt;Blocos de código são delimitados por palavras-chave como &lt;code&gt;def&lt;/code&gt; e &lt;code&gt;end&lt;/code&gt;, não por chaves&lt;/li&gt;
&lt;li&gt;Indentação é uma questão de estilo, não de sintaxe (diferente de Python)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por exemplo, um método simples em Ruby:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cumprimentar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="s2"&gt;"Olá, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;! Bem-vindo ao mundo Ruby."&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;cumprimentar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Maria"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: Olá, Maria! Bem-vindo ao mundo Ruby.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Strings e Interpolação
&lt;/h2&gt;

&lt;p&gt;Ruby oferece diversas maneiras de criar strings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aspas simples ('string'): processamento mínimo&lt;/li&gt;
&lt;li&gt;Aspas duplas ("string"): permite sequências de escape (\n) e interpolação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A interpolação é uma característica poderosa que permite inserir expressões dentro de strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"João"&lt;/span&gt;
&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; tem &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; anos e &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'é maior de idade'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'é menor de idade'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="c1"&gt;# Saída: João tem 30 anos e é maior de idade&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Arrays e Hashes: Coleções Fundamentais
&lt;/h2&gt;

&lt;p&gt;Ruby oferece duas estruturas principais para coleções:&lt;/p&gt;

&lt;h3&gt;
  
  
  Arrays
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;frutas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"maçã"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"laranja"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;frutas&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="c1"&gt;# Saída: maçã&lt;/span&gt;
&lt;span class="n"&gt;frutas&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"morango"&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;frutas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inspect&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: ["maçã", "morango", "laranja"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Hashes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;instrumento_secao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"violoncelo"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"cordas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"clarinete"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"madeiras"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"bateria"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"percussão"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"trompete"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"metais"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;instrumento_secao&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"clarinete"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: madeiras&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Símbolos: Identificadores Eficientes
&lt;/h2&gt;

&lt;p&gt;Símbolos são um tipo especial em Ruby, semelhantes a strings, mas otimizados para serem usados como identificadores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Usando símbolos como chaves em um hash&lt;/span&gt;
&lt;span class="n"&gt;instrumento_secao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="ss"&gt;:violoncelo&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"cordas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:clarinete&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"madeiras"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:bateria&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"percussão"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Sintaxe moderna para hashes com símbolos&lt;/span&gt;
&lt;span class="n"&gt;instrumento_secao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="ss"&gt;violoncelo: &lt;/span&gt;&lt;span class="s2"&gt;"cordas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;clarinete: &lt;/span&gt;&lt;span class="s2"&gt;"madeiras"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;bateria: &lt;/span&gt;&lt;span class="s2"&gt;"percussão"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;instrumento_secao&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:clarinete&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: madeiras&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os símbolos são imutáveis e únicos em memória, tornando-os ideais para chaves de hash e identificadores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expressões Regulares Integradas
&lt;/h2&gt;

&lt;p&gt;Ruby tem suporte nativo para expressões regulares, tornando a manipulação de texto muito mais poderosa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s2"&gt;"programando em ruby"&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/ruby|rust/&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Linguagem de programação mencionada!"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Python é incrível"&lt;/span&gt;
&lt;span class="n"&gt;novo_texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/Python/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ruby'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;novo_texto&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: Ruby é incrível&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Blocos: O Superpoder de Ruby
&lt;/h2&gt;

&lt;p&gt;Os blocos são um dos recursos mais distintivos e poderosos de Ruby. São trechos de código que podem ser passados para métodos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Bloco de uma linha com chaves&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&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="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Bloco multilinhas com do/end&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&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="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"O dobro de &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; é &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os blocos são usados extensivamente na biblioteca padrão para operações como enumeração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;animais&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"gato"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"cachorro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"cavalo"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;animais&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;animal&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;animal&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="c1"&gt;# Saída: gato cachorro cavalo &lt;/span&gt;

&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;times&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;"*"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# Saída: *****&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Estruturas de Controle
&lt;/h2&gt;

&lt;p&gt;Ruby oferece as estruturas de controle tradicionais, mas com uma sintaxe mais limpa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;hoje&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;hoje&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saturday?&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Fazer tarefas domésticas"&lt;/span&gt;
&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;hoje&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sunday?&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Relaxar"&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Ir trabalhar"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Modificadores de declaração para código mais conciso&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Perigo, Robinson!"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;radiacao&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Entrada e Saída Simplificadas
&lt;/h2&gt;

&lt;p&gt;Ruby facilita a leitura e escrita de dados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Saída&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Olá, mundo!"&lt;/span&gt;  &lt;span class="c1"&gt;# Com quebra de linha&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;"Sem quebra"&lt;/span&gt;  &lt;span class="c1"&gt;# Sem quebra de linha&lt;/span&gt;

&lt;span class="c1"&gt;# Entrada&lt;/span&gt;
&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;gets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chomp&lt;/span&gt;  &lt;span class="c1"&gt;# Remove a quebra de linha&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Olá, &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!"&lt;/span&gt;

&lt;span class="c1"&gt;# Processando arquivos linha por linha&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;linha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;gets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;downcase&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Ruby é uma linguagem que abraça completamente o paradigma orientado a objetos, proporcionando uma experiência de programação consistente, expressiva e agradável. A sua sintaxe clara e recursos poderosos como blocos, expressões regulares nativas e símbolos a tornam uma escolha excelente para diversos tipos de projetos.&lt;/p&gt;

&lt;p&gt;O foco da linguagem na elegância e simplicidade reflete a filosofia do seu criador, Yukihiro "Matz" Matsumoto: "Ruby foi projetado para tornar os programadores felizes." E, de fato, muitos desenvolvedores descobrem uma nova alegria na programação quando começam a explorar o mundo Ruby.&lt;/p&gt;

&lt;p&gt;Se você está buscando uma linguagem que combine poder, flexibilidade e elegância, Ruby merece um lugar especial em seu arsenal de ferramentas de desenvolvimento.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>ruby</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Entendendo a Arquitetura MVC no Ruby on Rails: A Base para Aplicações Web Robustas</title>
      <dc:creator>Marcos Fernandes</dc:creator>
      <pubDate>Wed, 21 May 2025 13:34:57 +0000</pubDate>
      <link>https://dev.to/marcosfernandesdev/entendendo-a-arquitetura-mvc-no-ruby-on-rails-a-base-para-aplicacoes-web-robustas-4jl9</link>
      <guid>https://dev.to/marcosfernandesdev/entendendo-a-arquitetura-mvc-no-ruby-on-rails-a-base-para-aplicacoes-web-robustas-4jl9</guid>
      <description>&lt;p&gt;Se você está começando no desenvolvimento web com Ruby on Rails, ou mesmo se já tem alguma experiência, entender profundamente a arquitetura MVC (Model-View-Controller) é fundamental para criar aplicações organizadas, escaláveis e fáceis de manter. Neste artigo, vamos desvendar como o Rails implementa esse padrão de design e por que ele é tão poderoso.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é a Arquitetura MVC?
&lt;/h2&gt;

&lt;p&gt;A arquitetura MVC é um padrão de design que separa uma aplicação em três componentes principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model (Modelo)&lt;/strong&gt;: Gerencia os dados e a lógica de negócios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View (Visão)&lt;/strong&gt;: Exibe as informações ao usuário&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controller (Controlador)&lt;/strong&gt;: Orquestra a aplicação, recebendo eventos do mundo externo e coordenando o modelo e a visão&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este "triunvirato" — modelo, visão e controlador — trabalha em conjunto para criar uma separação clara de responsabilidades, resultando em código mais limpo e manutenível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como Funciona o MVC no Rails?
&lt;/h2&gt;

&lt;p&gt;O Ruby on Rails é um framework MVC por excelência. Ele impõe uma estrutura para sua aplicação: você desenvolve modelos, visões e controladores como partes separadas de funcionalidade, e o Rails os conecta durante a execução do programa.&lt;/p&gt;

&lt;p&gt;Um dos grandes benefícios do Rails é que este processo de integração é baseado no uso de convenções inteligentes, eliminando a necessidade de configurações externas. Como diz a filosofia do Rails: "Convenção sobre configuração".&lt;/p&gt;

&lt;h2&gt;
  
  
  O Fluxo de uma Requisição no Rails
&lt;/h2&gt;

&lt;p&gt;Vamos entender como uma requisição é processada em uma aplicação Rails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Roteamento&lt;/strong&gt;: Quando uma requisição chega (por exemplo, quando um usuário clica em "Adicionar ao Carrinho"), ela é enviada primeiro para o roteador, que determina qual controlador deve ser acionado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controlador&lt;/strong&gt;: O controlador apropriado recebe a requisição e executa a ação correspondente. Por exemplo, o método &lt;code&gt;create()&lt;/code&gt; em um controlador de itens de linha.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interação com o Modelo&lt;/strong&gt;: O controlador interage com o modelo para acessar ou modificar dados (como adicionar um produto ao carrinho de compras).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Preparação para a Visão&lt;/strong&gt;: O controlador prepara as informações necessárias para a visão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Renderização&lt;/strong&gt;: A visão é renderizada e enviada de volta ao navegador do usuário.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Métodos HTTP no Rails
&lt;/h2&gt;

&lt;p&gt;No Rails, diferentes métodos HTTP são associados a diferentes ações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET&lt;/strong&gt;: Para recuperar informações&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POST&lt;/strong&gt;: Geralmente associado a ações de criação&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PUT/PATCH&lt;/strong&gt;: Para atualizar registros&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELETE&lt;/strong&gt;: Para remover registros&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por convenção, quando recebemos uma requisição POST para um recurso, o Rails sabe que deve invocar o método &lt;code&gt;create()&lt;/code&gt; no controlador correspondente.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Poder do Scaffolding
&lt;/h2&gt;

&lt;p&gt;Uma das ferramentas mais poderosas do Rails é sua capacidade de gerar "scaffolding" — código básico para modelos, visões e controladores com operações CRUD completas. Isso permite que você comece rapidamente com uma estrutura funcional e a refine conforme necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A arquitetura MVC implementada pelo Ruby on Rails oferece uma estrutura clara e organizada para o desenvolvimento de aplicações web. Ao separar claramente as responsabilidades entre modelo, visão e controlador, o Rails facilita a criação de código modular, testável e manutenível.&lt;/p&gt;

&lt;p&gt;Esta abordagem é como construir um arranha-céu com as vigas já no lugar — fica muito mais fácil pendurar o resto das peças quando a estrutura já está lá. E com as convenções inteligentes do Rails, você pode se concentrar em construir recursos exclusivos para sua aplicação, em vez de se preocupar com a configuração da infraestrutura.&lt;/p&gt;

&lt;p&gt;Se você está começando com Rails, recomendo fortemente que dedique tempo para compreender profundamente o MVC — este conhecimento será a base sobre a qual você construirá aplicações web robustas e elegantes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;E você, já trabalhou com Ruby on Rails ou outros frameworks MVC? Compartilhe suas experiências nos comentários!&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
