CINXE.COM

Lançado Ruby 3.2.0 RC 1

<!DOCTYPE html> <html> <head><script type="text/javascript" src="/_static/js/bundle-playback.js?v=HxkREWBo" charset="utf-8"></script> <script type="text/javascript" src="/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script> <script>window.RufflePlayer=window.RufflePlayer||{};window.RufflePlayer.config={"autoplay":"on","unmuteOverlay":"hidden"};</script> <script type="text/javascript" src="/_static/js/ruffle/ruffle.js"></script> <script type="text/javascript"> __wm.init("https://web.archive.org/web"); __wm.wombat("https://www.ruby-lang.org/pt/news/2022/12/06/ruby-3-2-0-rc1-released/","20240802231832","https://web.archive.org/","web","/_static/", "1722640712"); </script> <link rel="stylesheet" type="text/css" href="/_static/css/banner-styles.css?v=S1zqJCYt" /> <link rel="stylesheet" type="text/css" href="/_static/css/iconochive.css?v=3PDvdIFv" /> <!-- End Wayback Rewrite JS Include --> <meta charset="utf-8"> <title>Lançado Ruby 3.2.0 RC 1</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta itemprop="image" content="https://web.archive.org/web/20240802231832im_/https://www.ruby-lang.org/images/header-ruby-logo@2x.png"> <meta name="description" content=""> <link rel="stylesheet" type="text/css" href="/web/20240802231832cs_/https://www.ruby-lang.org/stylesheets/normalize.css"> <link rel="stylesheet" type="text/css" href="/web/20240802231832cs_/https://www.ruby-lang.org/stylesheets/main.css"> <link rel="stylesheet" type="text/css" href="/web/20240802231832cs_/https://www.ruby-lang.org/stylesheets/pygments.css"> <link rel="stylesheet" type="text/css" href="/web/20240802231832cs_/https://www.ruby-lang.org/stylesheets/mobile.css"> <link rel="stylesheet" type="text/css" href="/web/20240802231832cs_/https://www.ruby-lang.org/stylesheets/print.css"> <link href="https://web.archive.org/web/20240802231832cs_/https://fonts.googleapis.com/css?family=Noto+Sans:400,700,400italic,700italic&amp;subset=latin,cyrillic,greek,vietnamese" rel="stylesheet" type="text/css"> <link rel="canonical" href="https://web.archive.org/web/20240802231832/https://www.ruby-lang.org/pt/news/2022/12/06/ruby-3-2-0-rc1-released/"> <link rel="shortcut icon" type="image/x-icon" href="/web/20240802231832im_/https://www.ruby-lang.org/favicon.ico"> <link href="/web/20240802231832/https://www.ruby-lang.org/pt/feeds/news.rss" rel="alternate" title="Em português" type="application/rss+xml"> <script type="text/javascript" src="/web/20240802231832js_/https://www.ruby-lang.org/javascripts/jquery.min.js"></script> <script type="text/javascript" src="/web/20240802231832js_/https://www.ruby-lang.org/javascripts/page.js"></script> </head> <body> <div id="header"> <div id="header_content" class="container"> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/"> <h1>Ruby</h1> <h2>O melhor amigo do programador</h2> </a> <div class="site-links"> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/" class="home">Início</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/downloads/">Downloads</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/documentation/">Documentação</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/libraries/">Módulos</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/community/">Comunidade</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/news/">Notícias</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/security/">Segurança</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/about/">Sobre Ruby</a> <a href="#" class="menu selected">Menu</a> </div> <div id="search-box"> <form id="search-form" action="https://web.archive.org/web/20240802231832/https://www.google.com/cse"> <table class="fieldset"> <tr> <td> <input class="field" type="text" name="q" size="31" style="background: white url(//web.archive.org/web/20240802231832im_/https://www.google.com/coop/intl/pt/images/google_custom_search_watermark.gif) left no-repeat" onfocus="this.style.background='white'" onblur="if (/^\s*$/.test(this.value)) this.style.background='white url(//www.google.com/coop/intl/pt/images/google_custom_search_watermark.gif) left no-repeat'"/> </td> <td> <input type="hidden" name="cx" value="013598269713424429640:g5orptiw95w"/> <input type="hidden" name="ie" value="UTF-8"/> <input class="button" type="submit" name="sa" value="Procurar"/> </td> </tr> </table> </form> </div> </div> </div> <div id="page"> <div id="main-wrapper" class="container"> <div id="main"> <div id="content-wrapper"> <h1>Lançado Ruby 3.2.0 RC 1</h1> <div id="content"> <p class="post-info">Escrito por naruse em 06/12/2022<br> Traduzido por guicruzzs</p> <p>Estamos contentes em anunciar o lançamento do Ruby 3.2.0-rc1. Ruby 3.2 adds many features and performance improvements.</p> <h2>Suporte a WebAssembly com WASI</h2> <p>Esse é um port inicial de suporte a WebAssembly com WASI. Isso permite um binário CRuby ficar disponível num navegador Web, num ambiente Serverless Edge, ou em outros tipos de WebAssembly/WASI embedders. Atualmente esse port passa suítes de teste básica e bootstrap não utilizando a Thread API.</p> <p><img src="https://web.archive.org/web/20240802231832im_/https://i.imgur.com/opCgKy2.png" alt=""/></p> <h3>Contexto</h3> <p><a href="https://web.archive.org/web/20240802231832/https://webassembly.org/">WebAssembly (Wasm)</a> foi originalmente introduzido para rodar programas seguramente e rápido em navegadores web. Mas seu objetivo - rodar programas eficientemente com segurança em ambiente variado - é desejado há muito tempo não somente para web, mas também para aplicações em geral.</p> <p><a href="https://web.archive.org/web/20240802231832/https://wasi.dev/">WASI (The WebAssembly System Interface)</a> é projetado para tais casos de uso. Embora tais aplicações precisem se comunicar com os sistemas operacionais, WebAssembly roda numa máquina virtual que não possui uma interface com o sistema. WASI padroniza isso.</p> <p>O suporte a WebAssembly/WASI em Ruby pretende alavancar esses projetos. Isso permite aos desenvolvedores Ruby a escreverem aplicações que rodam em tais plataformas.</p> <h3>Caso de uso</h3> <p>Esse suporte encoraja desenvolvedores a utilizarem CRuby em um ambiente WebAssembly. Um exemplo de caso de uso é o suporte a CRuby do <a href="https://web.archive.org/web/20240802231832/https://try.ruby-lang.org/playground/">TryRuby playground</a>. Agora você pode testar o CRuby original no seu navegador web.</p> <h3>Questões técnicas</h3> <p>O WASI e o WebAssembly de hoje estão com algumas funcionalidades faltando para implementar Fiber, exceção, e GC porque ainda estão evoluindo, e também por questões de segurança. Então o CRuby preenche essa lacuna através do Asyncify, que é uma técnica de transformação binária para controlar a execução na userland.</p> <p>Além disso, nós construímos <a href="https://web.archive.org/web/20240802231832/https://github.com/kateinoigakukun/wasi-vfs/wiki/Getting-Started-with-CRuby">um VFS(sistema de arquivo virtual) em cima do WASI</a> assim nós podemos facilmente empacotar aplicações Ruby em um único arquivo .wasm. Isso torna a distribuição de aplicações Ruby um pouco mais fácil.</p> <h3>Links relacionados</h3> <ul> <li><a href="https://web.archive.org/web/20240802231832/https://github.com/ruby/ruby/pull/5407">Add WASI based WebAssembly support #5407</a></li> <li><a href="https://web.archive.org/web/20240802231832/https://itnext.io/final-report-webassembly-wasi-support-in-ruby-4aface7d90c9">An Update on WebAssembly/WASI Support in Ruby</a></li> </ul> <h2>Melhorias em Regexp contra ReDoS</h2> <p>Se sabe que o tempo de verificação de uma Regexp pode ser inesperadamente longo. Se seu código tenta verificar uma Regexp possivelmente ineficiente contra um input não confiável, um invasor pode explorar isso para uma eficiente Denial of Service (então chamada Regular expression DoS, ou ReDoS).</p> <p>Nós introduzimos duas melhoria que significantemente mitigam ReDoS.</p> <h3>Algoritmo de verificação de Regexp melhorado</h3> <p>Desde o Ruby 3.2, o algoritmo de verificação de Regexp tem sido grandemente melhorado usando a técnica de memoization.</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Isso leva 10 seg. no Ruby 3.1, e 0.003 seg. no Ruby 3.2 /^a*b?a*$/ =~ "a" * 50000 + "x" </code></pre></div></div> <p><img src="https://web.archive.org/web/20240802231832im_/https://cache.ruby-lang.org/pub/media/ruby320_regex_1.png" alt=""/> <img src="https://web.archive.org/web/20240802231832im_/https://cache.ruby-lang.org/pub/media/ruby320_regex_2.png" alt=""/></p> <p>O algoritmo melhorado de verificação permite que a maioria das verificações de Regexp (cerca de 90% em nossos experimentos) sejam completadas em tempo linear.</p> <p>(Para usuários da prévia: Essa otimização pode consumir memória proporcionalmente à entrada pra cada verificação. Nós esperamos que nenhum problema prático surja porque essa alocação de memória é normalmente atrasada, e uma Regexp normalmente deveria consumir no máximo 10 vezes mais que o comprimento do input. Se você ficar sem memória ao realizar verificações de Regexps numa aplicação do mundo real, por favor nos relate.)</p> <p>A proposta original é <a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/19104">https://bugs.ruby-lang.org/issues/19104</a></p> <h3>Timeout de Regexp</h3> <p>A otimização acima não pode ser aplicada a alguns tipos de expressões regulares, tais como aquelas que incluem funcionalidades avançadas (e.g., back-references ou look-around), ou com um grande número fixado de repetições. Como medida de fallback, uma funcionalidade de timeout na verificação de Regexp também é introduzida.</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Regexp</span><span class="p">.</span><span class="nf">timeout</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="sr">/^a*b?a*()\1$/</span> <span class="o">=~</span> <span class="s2">"a"</span> <span class="o">*</span> <span class="mi">50000</span> <span class="o">+</span> <span class="s2">"x"</span> <span class="c1">#=&gt; Regexp::TimeoutError é devolvido em um segundo</span> </code></pre></div></div> <p>Perceba que <code class="language-plaintext highlighter-rouge">Regexp.timeout</code> é uma configuração global. Se deseja usar uma configuração diferente de timeout pra alguma Regexp em especial, você pode usar a chave <code class="language-plaintext highlighter-rouge">timeout</code> no <code class="language-plaintext highlighter-rouge">Regexp.new</code>.</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Regexp</span><span class="p">.</span><span class="nf">timeout</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="c1"># Essa regexp não possui timeout</span> <span class="n">long_time_re</span> <span class="o">=</span> <span class="no">Regexp</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="s1">'^a*b?a*()\1$'</span><span class="p">,</span> <span class="ss">timeout: </span><span class="no">Float</span><span class="o">::</span><span class="no">INFINITY</span><span class="p">)</span> <span class="n">long_time_re</span> <span class="o">=~</span> <span class="s2">"a"</span> <span class="o">*</span> <span class="mi">50000</span> <span class="o">+</span> <span class="s2">"x"</span> <span class="c1"># nunca é interrompida</span> </code></pre></div></div> <p>A proposta original é <a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/17837">https://bugs.ruby-lang.org/issues/17837</a>.</p> <h2>Outras Novas Funcionalidades Notórias</h2> <h3>SyntaxSuggest</h3> <ul> <li> <p>A funcionalidade de <code class="language-plaintext highlighter-rouge">syntax_suggest</code> (anteriormente <code class="language-plaintext highlighter-rouge">dead_end</code>) está integrada ao Ruby. Isso ajuda você a encontrar a posição dos erros tais como <code class="language-plaintext highlighter-rouge">end</code>s faltantes ou supérfluos, pra te trazer de volta ao seu caminho mais rapidamente, assim com o exemplo a seguir:</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ? 1 class Dog &gt; 2 defbark &gt; 3 end 4 end </code></pre></div> </div> <p>[<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18159">Feature #18159</a>]</p> </li> </ul> <h3>ErrorHighlight</h3> <ul> <li>Agora ele aponta aos argumentos relevantes para TypeError e ArgumentError</li> </ul> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>test.rb:2:in `+': nil can't be coerced into Integer (TypeError) sum = ary[0] + ary[1] ^^^^^^ </code></pre></div></div> <h3>Linguagem</h3> <ul> <li> <p>Argumentos rest anônimos e palavra-chave rest agora podem ser passados como argumentos, em vez de serem usados apenas em parâmetros do método. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18351">Feature #18351</a>]</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="n">bar</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">end</span> <span class="k">def</span> <span class="nf">baz</span><span class="p">(</span><span class="o">**</span><span class="p">)</span> <span class="n">quux</span><span class="p">(</span><span class="o">**</span><span class="p">)</span> <span class="k">end</span> </code></pre></div> </div> </li> <li> <p>Uma proc que aceita um único argumento posicional e palavras-chave não irá mais autosplat. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18633">Bug #18633</a>]</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">proc</span><span class="p">{</span><span class="o">|</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">k</span><span class="o">|</span> <span class="n">a</span><span class="p">}.</span><span class="nf">call</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">])</span> <span class="c1"># Ruby 3.1 e antes</span> <span class="c1"># =&gt; 1</span> <span class="c1"># Ruby 3.2 e depois</span> <span class="c1"># =&gt; [1, 2]</span> </code></pre></div> </div> </li> <li> <p>A ordem de avaliação de atribuição da constante para constantes definidas em objetos explícitos tornou-se consistente com a ordem de avaliação de atribuição de atributo único. Com esse código:</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="n">foo</span><span class="o">::</span><span class="no">BAR</span> <span class="o">=</span> <span class="n">baz</span> </code></pre></div> </div> <p><code class="language-plaintext highlighter-rouge">foo</code> agora é chamado antes de <code class="language-plaintext highlighter-rouge">baz</code>. Similarmente, para múltiplas atribuições para constantes a ordem esquerda-para-direita é usada. Com esse código:</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="n">foo1</span><span class="o">::</span><span class="no">BAR1</span><span class="p">,</span> <span class="n">foo2</span><span class="o">::</span><span class="no">BAR2</span> <span class="o">=</span> <span class="n">baz1</span><span class="p">,</span> <span class="n">baz2</span> </code></pre></div> </div> <p>A seguinte ordem de avaliação agora é utilizada:</p> <ol> <li><code class="language-plaintext highlighter-rouge">foo1</code></li> <li><code class="language-plaintext highlighter-rouge">foo2</code></li> <li><code class="language-plaintext highlighter-rouge">baz1</code></li> <li><code class="language-plaintext highlighter-rouge">baz2</code></li> </ol> <p>[<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/15928">Bug #15928</a>]</p> </li> <li> <p>O find pattern não é mais experimental. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18585">Feature #18585</a>]</p> </li> <li> <p>Métodos recebendo um parâmetro rest (como <code class="language-plaintext highlighter-rouge">*args</code>) e desejando delegar argumentos de palavra-chave através de <code class="language-plaintext highlighter-rouge">foo(*args)</code> devem agora serem marcados com <code class="language-plaintext highlighter-rouge">ruby2_keywords</code> (se ainda não for o caso). Em outras palavras, todos métodos que desejam delegar argumentos de palavras-chave através do <code class="language-plaintext highlighter-rouge">*args</code> devem agora serem marcados com <code class="language-plaintext highlighter-rouge">ruby2_keywords</code>, sem exceção. Isso fará mais fácil a transição para outras formas de delegação uma vez que uma biblioteca requira Ruby 3+. Anteriormente, a flag <code class="language-plaintext highlighter-rouge">ruby2_keywords</code> foi mantida se o método recebedor levava <code class="language-plaintext highlighter-rouge">*args</code>, mas isso era um bug de inconsistência. Uma boa técnica pra encontrar potenciais <code class="language-plaintext highlighter-rouge">ruby2_keywords</code> faltantes é rodar a suíte de testes, encontrar o último método que deve receber argumentos para cada lugar onte a suíte de teste falha, e usar <code class="language-plaintext highlighter-rouge">puts nil, caller, nil</code> lá. Então verifique que cada método/bloco da cadeia de chamada que deve delegar palavras-chave está corretamente marcado com <code class="language-plaintext highlighter-rouge">ruby2_keywords</code>. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18625">Bug #18625</a>] [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/16466">Bug #16466</a>]</p> <div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">def</span> <span class="nf">target</span><span class="p">(</span><span class="o">**</span><span class="n">kw</span><span class="p">)</span> <span class="k">end</span> <span class="c1"># Acidentalmente funcionou sem ruby2_keywords no Ruby 2.7-3.1, ruby2_keywords</span> <span class="c1"># é necessário em 3.2+. Assim como (*args, **kwargs) ou (...) seriam necessários</span> <span class="c1"># em #foo e #bar quando migrar de ruby2_keywords.</span> <span class="n">ruby2_keywords</span> <span class="k">def</span> <span class="nf">bar</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="n">target</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="k">end</span> <span class="n">ruby2_keywords</span> <span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="n">bar</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="k">end</span> <span class="n">foo</span><span class="p">(</span><span class="ss">k: </span><span class="mi">1</span><span class="p">)</span> </code></pre></div> </div> </li> </ul> <h2>Melhorias de desempenho</h2> <h3>YJIT</h3> <ul> <li>YJIT agora suporta x86-64 e arm64/aarch64 CPUs no Linux, MacOS, BSD e outras plataformas UNIX. <ul> <li>Essa release trás suporte para os processadores Mac M1/M2, AWS Graviton e Raspberry Pi 4 ARM64.</li> </ul> </li> <li>O build do YJIT agora requer Rust 1.58.0+. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18481">Feature #18481</a>] <ul> <li>Para garantir que CRuby seja buildado com YJIT, por favor instale rustc &gt;= 1.58.0 e rode <code class="language-plaintext highlighter-rouge">./configure</code> com <code class="language-plaintext highlighter-rouge">--enable-yjit</code>.</li> <li>Por favor entre em contato com o time do YJITP caso tenha qualquer problema.</li> </ul> </li> <li>Memória física para o código JIT é alocada de forma lazy. Diferente do Ruby 3.1, o RSS de um processo Ruby é minimizado por conta das páginas de memória virtual alocadas por <code class="language-plaintext highlighter-rouge">--yjit-exec-mem-size</code> que não serão mapeadas para páginas de memória física até que sejam utilizadas pelo código JIT. <ul> <li>Introduz GC(Garbage collector) que libera todas as páginas de código quando o consumo de memória do código JIT atinge <code class="language-plaintext highlighter-rouge">--yjit-exec-mem-size</code>. <ul> <li><code class="language-plaintext highlighter-rouge">RubyVM::YJIT.runtime_stats</code> retorna métricas do GC além das chaves existentes em <code class="language-plaintext highlighter-rouge">inline_code_size</code> e <code class="language-plaintext highlighter-rouge">outlined_code_size</code>: <code class="language-plaintext highlighter-rouge">code_gc_count</code>, <code class="language-plaintext highlighter-rouge">live_page_count</code>, <code class="language-plaintext highlighter-rouge">freed_page_count</code>, e <code class="language-plaintext highlighter-rouge">freed_code_size</code>.</li> </ul> </li> </ul> </li> <li>A maioria das estastísticas produzidas por RubyVM::YJIT.runtime_stats estão agora disponíveis nas release builds. <ul> <li>Simplesmente rode ruby com <code class="language-plaintext highlighter-rouge">--yjit-stats</code> para calcular e obter estatísticas (fica sujeito a sobrecarga de tempo de execução).</li> </ul> </li> <li>YJIT agora está otimizado para tirar vantagem de formatos de objetos. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18776">Feature #18776</a>]</li> <li>Tira vantagem de invalidação de constantes de forma mais granular para invalidar menos código ao definir novas constantes. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18589">Feature #18589</a>]</li> </ul> <h3>MJIT</h3> <ul> <li>O compilador MJIT está reimplementado em Ruby como uma bilioteca padrão <code class="language-plaintext highlighter-rouge">mjit</code>.</li> <li>O compilador MJIT é executado sob um processo fork ao invés de fazer isso em uma thread nativa chamada worker MJIT. [[Feature #18968]] <ul> <li>Como resultado, Microsoft Visual Studio (MSWIN) não é mais suportado.</li> </ul> </li> <li>MinGW não é mais suportado. [[Feature #18824]]</li> <li>Renomeado <code class="language-plaintext highlighter-rouge">--mjit-min-calls</code> para <code class="language-plaintext highlighter-rouge">--mjit-call-threshold</code>.</li> <li>Mudado valor padrão <code class="language-plaintext highlighter-rouge">--mjit-max-cache</code> de 10000 para 100.</li> </ul> <h3>PubGrub</h3> <ul> <li> <p>Bundler 2.4 agora utiliza o resolvedor de versão <a href="https://web.archive.org/web/20240802231832/https://github.com/jhawthorn/pub_grub">PubGrub</a> ao invés de <a href="https://web.archive.org/web/20240802231832/https://github.com/CocoaPods/Molinillo">Molinillo</a>.</p> <ul> <li>PubGrub é a próxima geração de algoritmo resolvedor utilizado pelo gerenciador de pacote <code class="language-plaintext highlighter-rouge">pub</code> da linguagem de programação Dart.</li> <li>Você pode obter um resultado de resolução de versões diferentes depois dessa mudança. Por favor relate tais casos para <a href="https://web.archive.org/web/20240802231832/https://github.com/rubygems/rubygems/issues">RubyGems/Bundler issues</a></li> </ul> </li> <li> <p>RubyGems ainda utiliza o resolvedor Molinillo no Ruby 3.2. Nós planejamos trocá-lo pelo PubGrub no futuro.</p> </li> </ul> <h2>Other notable changes since 3.1</h2> <ul> <li>Hash <ul> <li>Hash#shift agora sempre retorna nil se o hash está vazio, ao invés de retornar o valor padrão ou chamar a proc padrão. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/16908">Bug #16908</a>]</li> </ul> </li> <li>MatchData <ul> <li>MatchData#byteoffset foi adicionado. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/13110">Feature #13110</a>]</li> </ul> </li> <li>Module <ul> <li>Module.used_refinements foi adicionado. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/14332">Feature #14332</a>]</li> <li>Module#refinements foi adicionado. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/12737">Feature #12737</a>]</li> <li>Module#const_added foi adicionado. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/17881">Feature #17881</a>]</li> </ul> </li> <li>Proc <ul> <li>Proc#dup retorna uma instância da subclasse. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/17545">Bug #17545</a>]</li> <li>Proc#parameters agora aceita a palavra-chave lambda. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/15357">Feature #15357</a>]</li> </ul> </li> <li>Refinement <ul> <li>Refinement#refined_class foi adicionado. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/12737">Feature #12737</a>]</li> </ul> </li> <li>RubyVM::AbstractSyntaxTree <ul> <li>Adicionada opção <code class="language-plaintext highlighter-rouge">error_tolerant</code> para <code class="language-plaintext highlighter-rouge">parse</code>, <code class="language-plaintext highlighter-rouge">parse_file</code> e <code class="language-plaintext highlighter-rouge">of</code>. [[Feature #19013]]</li> </ul> </li> <li>Set <ul> <li>Set agora está disponível como uma classe builtin sem necessidade de <code class="language-plaintext highlighter-rouge">require "set"</code>. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/16989">Feature #16989</a>] Ela está atualmente autoloaded via constante <code class="language-plaintext highlighter-rouge">Set</code> ou chamada em <code class="language-plaintext highlighter-rouge">Enumerable#to_set</code>.</li> </ul> </li> <li>String <ul> <li>String#byteindex e String#byterindex foram adicionados. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/13110">Feature #13110</a>]</li> <li>Atualizado Unicode para Versão 15.0.0 e Emoji Versão 15.0. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18639">Feature #18639</a>] (também aplicado para Regexp)</li> <li>String#bytesplice foi adicionado. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18598">Feature #18598</a>]</li> </ul> </li> <li>Struct <ul> <li>Uma classe Struct pode também ser inicializada com argumentos de palavras-chave sem <code class="language-plaintext highlighter-rouge">keyword_init: true</code> em <code class="language-plaintext highlighter-rouge">Struct.new</code> [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/16806">Feature #16806</a>]</li> </ul> </li> </ul> <h2>Issues de compatibilidade</h2> <p>Nota: Excluindo correção de bugs de funcionalidades.</p> <h3>Constantes removidas</h3> <p>As seguintes constantes obsoletas foram removidas.</p> <ul> <li><code class="language-plaintext highlighter-rouge">Fixnum</code> e <code class="language-plaintext highlighter-rouge">Bignum</code> [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/12005">Feature #12005</a>]</li> <li><code class="language-plaintext highlighter-rouge">Random::DEFAULT</code> [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/17351">Feature #17351</a>]</li> <li><code class="language-plaintext highlighter-rouge">Struct::Group</code></li> <li><code class="language-plaintext highlighter-rouge">Struct::Passwd</code></li> </ul> <h3>Métodos removidos</h3> <p>Os seguintes métodos obsoletos foram removidos.</p> <ul> <li><code class="language-plaintext highlighter-rouge">Dir.exists?</code> [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/17391">Feature #17391</a>]</li> <li><code class="language-plaintext highlighter-rouge">File.exists?</code> [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/17391">Feature #17391</a>]</li> <li><code class="language-plaintext highlighter-rouge">Kernel#=~</code> [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/15231">Feature #15231</a>]</li> <li><code class="language-plaintext highlighter-rouge">Kernel#taint</code>, <code class="language-plaintext highlighter-rouge">Kernel#untaint</code>, <code class="language-plaintext highlighter-rouge">Kernel#tainted?</code> [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/16131">Feature #16131</a>]</li> <li><code class="language-plaintext highlighter-rouge">Kernel#trust</code>, <code class="language-plaintext highlighter-rouge">Kernel#untrust</code>, <code class="language-plaintext highlighter-rouge">Kernel#untrusted?</code> [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/16131">Feature #16131</a>]</li> </ul> <h3>Não empacota mais código fonte de terceiros</h3> <ul> <li> <p>Nós não empacotamos mais código fonte de terceiro como <code class="language-plaintext highlighter-rouge">libyaml</code>, <code class="language-plaintext highlighter-rouge">libffi</code>.</p> <ul> <li> <p>O código fonte do libyaml foi removido do psych. Você pode precisar instalar <code class="language-plaintext highlighter-rouge">libyaml-dev</code> na plataforma Ubuntu/Debian. O nome do pacote é diferente pra cada plataforma.</p> </li> <li> <p>O código fonte empacotado do libffi também foi removido do <code class="language-plaintext highlighter-rouge">fiddle</code></p> </li> </ul> </li> <li> <p>Psych e fiddle suportaram builds estáticos com versões específicas dos fontes de libyaml e libffi. Você pode rodar o build do psych com libyaml-0.2.5 assim:</p> <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>./configure <span class="nt">--with-libyaml-source-dir</span><span class="o">=</span>/path/to/libyaml-0.2.5 </code></pre></div> </div> <p>E você pode rodar o build do fiddle com libffi-3.4.4 assim:</p> <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>./configure <span class="nt">--with-libffi-source-dir</span><span class="o">=</span>/path/to/libffi-3.4.4 </code></pre></div> </div> <p>[<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/18571">Feature #18571</a>]</p> </li> </ul> <h2>Atualizações da API de C</h2> <h3>APIs de C atualizadas</h3> <p>As seguintes APIs foram atualizadas.</p> <ul> <li>Atualização do PRNG <ul> <li><code class="language-plaintext highlighter-rouge">rb_random_interface_t</code> atualizado e versionado. Bibliotecas de extensão que usam essa interface e buildadas para versões antigas. E também a função <code class="language-plaintext highlighter-rouge">init_int32</code> precisa ser definida.</li> </ul> </li> </ul> <h3>APIs de C removidas</h3> <p>As seguintes APIs se tornaram obsoletas e foram removidas.</p> <ul> <li>Variável <code class="language-plaintext highlighter-rouge">rb_cData</code>.</li> <li>Funções “taintedness” e “trustedness”. [<a href="https://web.archive.org/web/20240802231832/https://bugs.ruby-lang.org/issues/16131">Feature #16131</a>]</li> </ul> <h2>Atualizações da biblioteca padrão</h2> <ul> <li>As seguintes gems padrão foram atualizadas. <ul> <li>RubyGems 3.4.0.dev</li> <li>benchmark 0.2.1</li> <li>bigdecimal 3.1.3</li> <li>bundler 2.4.0.dev</li> <li>cgi 0.3.6</li> <li>date 3.3.0</li> <li>delegate 0.3.0</li> <li>did_you_mean 1.6.2</li> <li>digest 3.1.1</li> <li>drb 2.1.1</li> <li>erb 4.0.2</li> <li>error_highlight 0.5.1</li> <li>etc 1.4.1</li> <li>fcntl 1.0.2</li> <li>fiddle 1.1.1</li> <li>fileutils 1.7.0</li> <li>forwardable 1.3.3</li> <li>getoptlong 0.2.0</li> <li>io-console 0.5.11</li> <li>io-nonblock 0.2.0</li> <li>io-wait 0.3.0.pre</li> <li>ipaddr 1.2.5</li> <li>irb 1.5.1</li> <li>json 2.6.2</li> <li>logger 1.5.2</li> <li>mutex_m 0.1.2</li> <li>net-http 0.3.1</li> <li>net-protocol 0.2.0</li> <li>nkf 0.1.2</li> <li>open-uri 0.3.0</li> <li>openssl 3.1.0.pre</li> <li>optparse 0.3.0</li> <li>ostruct 0.5.5</li> <li>pathname 0.2.1</li> <li>pp 0.4.0</li> <li>pstore 0.1.2</li> <li>psych 5.0.0</li> <li>racc 1.6.1</li> <li>rdoc 6.5.0</li> <li>reline 0.3.1</li> <li>resolv 0.2.2</li> <li>securerandom 0.2.1</li> <li>set 1.0.3</li> <li>stringio 3.0.3</li> <li>syntax_suggest 1.0.1</li> <li>timeout 0.3.1</li> <li>tmpdir 0.1.3</li> <li>tsort 0.1.1</li> <li>un 0.2.1</li> <li>uri 0.12.0</li> <li>win32ole 1.8.9</li> <li>zlib 3.0.0</li> </ul> </li> <li>As seguintes gems empacotadas foram atualizadas. <ul> <li>minitest 5.16.3</li> <li>power_assert 2.0.2</li> <li>test-unit 3.5.5</li> <li>net-ftp 0.2.0</li> <li>net-imap 0.3.1</li> <li>net-pop 0.1.2</li> <li>net-smtp 0.3.3</li> <li>rbs 2.8.1</li> <li>typeprof 0.21.3</li> <li>debug 1.7.0</li> </ul> </li> </ul> <p>Veja <a href="https://web.archive.org/web/20240802231832/https://github.com/ruby/ruby/blob/v3_2_0_rc1/NEWS.md">NOVIDADES</a> ou <a href="https://web.archive.org/web/20240802231832/https://github.com/ruby/ruby/compare/v3_1_0...v3_2_0_rc1">commit logs</a> para mais detalhes.</p> <p>Com estas mudanças, <a href="https://web.archive.org/web/20240802231832/https://github.com/ruby/ruby/compare/v3_1_0...v3_2_0_rc1#file_bucket">2846 arquivos mudados, 203950 inserções(+), 127153 remoções(-)</a> desde o Ruby 3.1.0!</p> <h2>Download</h2> <ul> <li> <p><a href="https://web.archive.org/web/20240802231832/https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.tar.gz">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.tar.gz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>SIZE: 20253652 SHA1: 9b45af61ef1ae3c21ab88d7c9e30b80060116ac3 SHA256: 3bb9760c1ac1b66416aaa4899809f6ccd010e57038eaaeca19a383fd56275dac SHA512: 798157d785ebae94cb128d3c134fa35e0e90c654972e531cb6562823042f3fb68a270226f7b1cf0c42572ef2b1488a1a3e44f88389ad2a6f9ca4b280a2a8e759 </code></pre></div> </div> </li> <li> <p><a href="https://web.archive.org/web/20240802231832/https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.tar.xz">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.tar.xz</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>SIZE: 14934012 SHA1: 5576e304786d466410f27a345dc1cb66f2c773f6 SHA256: 0d45b3af14e84337882a2021235a091ae5dcfc0baaf31dccc479b71d96dd07bc SHA512: d38fcb1e09eb9984f3b2347e65ae7406129c2578d068a25d33b5b4f021ec3b567a9abe56c2acbec6d07a3c2b4bc7b485dbd330cbfbb3a96350f60a2bb94d016e </code></pre></div> </div> </li> <li> <p><a href="https://web.archive.org/web/20240802231832/https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.zip">https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-rc1.zip</a></p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>SIZE: 24473024 SHA1: 8fdc85363ce61e0b8f04da36e709d49028d04a75 SHA256: 7ff32473be108534548e401aaa9092c37a27f73323ea4091c33901c714c87ee5 SHA512: 07adf6a9c89fdcf420e7b131f40f2b1f4aca036aa6f28539ade26ca552f84a75e0698f77a8b774d2ea52b8c756c4982ef319bda5afa786c081a31dd9873c5ef7 </code></pre></div> </div> </li> </ul> <h2>What is Ruby</h2> <p>Ruby foi primeiramente desenvolvido por Matz (Yukihiro Matsumoto) em 1993 e agora é desenvolvido como Open Source. Ele roda em múltiplas plataformas e é usado em todo o mundo, especialmente para desenvolvimento web.</p> </div> </div> <hr class="hidden-modern"/> <div id="sidebar-wrapper"> <div id="sidebar"> <div class="navigation"> <h3><strong>Notícias Recentes</strong></h3> <ul class="menu"> <li><a href="/web/20240802231832/https://www.ruby-lang.org/pt/news/2022/12/25/ruby-3-2-0-released/">Lançado Ruby 3.2.0</a></li> <li><a href="/web/20240802231832/https://www.ruby-lang.org/pt/news/2022/12/06/ruby-3-2-0-rc1-released/">Lançado Ruby 3.2.0 RC 1</a></li> <li><a href="/web/20240802231832/https://www.ruby-lang.org/pt/news/2022/11/24/ruby-3-1-3-released/">Lançado Ruby 3.1.3</a></li> <li><a href="/web/20240802231832/https://www.ruby-lang.org/pt/news/2022/11/24/ruby-3-0-5-released/">Lançado Ruby 3.0.5</a></li> <li><a href="/web/20240802231832/https://www.ruby-lang.org/pt/news/2022/11/24/ruby-2-7-7-released/">Lançado Ruby 2.7.7</a></li> </ul> </div> <h3>Feeds de notícias (RSS)</h3> <p><a href="/web/20240802231832/https://www.ruby-lang.org/pt/feeds/news.rss">Em português</a></p> </div> </div> <hr class="hidden-modern"/> </div> </div> </div> <div class="container"> <div id="footer"> <div class="site-links"> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/" class="home">Início</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/downloads/">Downloads</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/documentation/">Documentação</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/libraries/">Módulos</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/community/">Comunidade</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/news/">Notícias</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/security/">Segurança</a> <a href="/web/20240802231832/https://www.ruby-lang.org/pt/about/">Sobre Ruby</a> </div> <p> Este site em outros idiomas: <a href="/web/20240802231832/https://www.ruby-lang.org/bg/">Български</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/de/">Deutsch</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/en/">English</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/es/">Español</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/fr/">Français</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/id/">Bahasa Indonesia</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/it/">Italiano</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/ja/">日本語</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/ko/">한국어</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/pl/">polski</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/pt/">Português</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/ru/">Русский</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/tr/">Türkçe</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/vi/">Tiếng Việt</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/zh_cn/">简体中文</a>, <a href="/web/20240802231832/https://www.ruby-lang.org/zh_tw/">繁體中文</a>. </p> <p><a href="/web/20240802231832/https://www.ruby-lang.org/pt/about/website/">Este website</a> é mantido com orgulho por membros da comunidade Ruby.</p> </div> </div> </body> </html> <!-- FILE ARCHIVED ON 23:18:32 Aug 02, 2024 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 21:01:06 Dec 03, 2024. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): captures_list: 0.595 exclusion.robots: 0.038 exclusion.robots.policy: 0.023 esindex: 0.011 cdx.remote: 49.539 LoadShardBlock: 366.78 (3) PetaboxLoader3.datanode: 152.054 (4) PetaboxLoader3.resolve: 135.014 (2) load_resource: 138.364 -->

Pages: 1 2 3 4 5 6 7 8 9 10