Escrito por naruse em 25/12/2024
                         Traduzido por nbluis
Estamos felizes em anunciar o lançamento do Ruby 3.4.0. Ruby 3.4 adiciona a referência de parâmetro de bloco it,
altera o Prism como parser padrão, adiciona suporte ao Happy Eyeballs Versão 2 na biblioteca de socket, melhora o YJIT,
adiciona GC Modular, e muito mais.
it é introduzido
it foi adicionado para referenciar um parâmetro de bloco sem nome de variável. [Feature #18980]
ary = ["foo", "bar", "baz"]
p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"]
it se comporta de maneira muito semelhante a _1. Quando a intenção é usar apenas _1 em um bloco, a possibilidade de outros parâmetros numerados como _2 aparecer impõe uma carga cognitiva extra aos leitores. Então it foi introduzido como um alias prático. Use it em casos simples onde it representa itself, como em blocos de uma linha.
Prism agora é o parser padrão
Alteração do parser padrão de parse.y para Prism. [Feature #20564]
Esta é uma melhoria interna e deve haver pouca mudança visível para o usuário. Se você notar algum problema de compatibilidade, por favor, reporte para nós.
Para usar o parser convencional, use o argumento de linha de comando --parser=parse.y.
A biblioteca de socket agora possui Happy Eyeballs Versão 2 (RFC 8305)
A biblioteca de socket agora possui Happy Eyeballs Version 2 (RFC 8305), a versão padronizada mais recente de uma abordagem amplamente adotada para melhor conectividade em muitas linguagens de programação, em TCPSocket.new (TCPSocket.open) e Socket.tcp.
Esta melhoria permite que o Ruby forneça conexões de rede eficientes e confiáveis, adaptadas aos ambientes modernos da internet.
Até o Ruby 3.3, esses métodos realizavam a resolução de nomes e tentativas de conexão de forma serial. Com este algoritmo, eles agora operam da seguinte forma:
- Realiza a resolução de nomes IPv6 e IPv4 simultaneamente
- Tenta conexões com os endereços IP resolvidos, priorizando IPv6, com tentativas paralelas escalonadas em intervalos de 250ms
- Retorna a primeira conexão bem-sucedida enquanto cancela quaisquer outras
Isso garante atrasos mínimos de conexão, mesmo se um protocolo específico ou endereço IP estiver atrasado ou indisponível.
Este recurso é habilitado por padrão, portanto, configuração adicional não é necessária para usá-lo. Para desativá-lo globalmente, defina a variável de ambiente RUBY_TCP_NO_FAST_FALLBACK=1 ou chame Socket.tcp_fast_fallback=false. Ou para desativá-lo em um método específico, use o argumento fast_fallback: false.
YJIT
TL;DR
- Melhor desempenho na maioria dos benchmarks em plataformas x86-64 e arm64.
- Uso reduzido de memória através de metadados comprimidos e um limite de memória unificado.
- Várias correções de bugs: YJIT agora é mais robusto e testado exaustivamente.
Novos recursos
- Opções de linha de comando
    - --yjit-mem-sizeintroduz um limite de memória unificado (padrão 128MiB) para rastrear o uso total de memória do YJIT, fornecendo uma alternativa mais intuitiva à antiga opção- --yjit-exec-mem-size.
- --yjit-loghabilita um log de compilação para rastrear o que é compilado.
 
- API Ruby
    - RubyVM::YJIT.logfornece acesso ao final do log de compilação em tempo de execução.
 
- Estatísticas do YJIT
    - RubyVM::YJIT.runtime_statsagora sempre fornece estatísticas adicionais sobre invalidação, inlining e codificação de metadados.
 
Novas otimizações
- Contexto comprimido reduz a memória necessária para armazenar metadados do YJIT
- Alocar registradores para variáveis locais e argumentos de métodos Ruby
- Quando o YJIT está habilitado, usa mais primitivas Core escritas em Ruby:
    - Array#each,- Array#select,- Array#mapreescritos em Ruby para melhor desempenho [Feature #20182].
 
- Capacidade de inline de métodos pequenos/triviais, como:
    - Métodos vazios
- Métodos que retornam uma constante
- Métodos que retornam self
- Métodos que retornam diretamente um argumento
 
- Geração de código especializada para muitos mais métodos em tempo de execução
- Otimiza String#getbyte,String#setbytee outros métodos de string
- Otimiza operações bitwise para acelerar a manipulação de bits/bytes de baixo nível
- Suporte a constantes compartilháveis em modo multi-ractor
- Várias outras otimizações incrementais
Modular GC
- 
    Implementações alternativas de garbage collector (GC) podem ser carregadas dinamicamente através do recurso de garbage collector modular. Para habilitar este recurso, configure o Ruby com --with-modular-gcno momento da compilação. Bibliotecas de GC podem ser carregadas em tempo de execução usando a variável de ambienteRUBY_GC_LIBRARY. [Feature #20351]
- 
    O garbage collector embutido do Ruby foi dividido em um arquivo separado em gc/default/default.ce interage com o Ruby usando uma API definida emgc/gc_impl.h. O garbage collector embutido agora também pode ser compilado como uma biblioteca usandomake modular-gc MODULAR_GC=defaulte habilitado usando a variável de ambienteRUBY_GC_LIBRARY=default. [Feature #20470]
- 
    Uma biblioteca experimental de GC é fornecida com base no MMTk. Esta biblioteca de GC pode ser compilada usando make modular-gc MODULAR_GC=mmtke habilitada usando a variável de ambienteRUBY_GC_LIBRARY=mmtk. Isso requer a ferramenta Rust na máquina de compilação. [Feature #20860]
Mudanças na linguagem
- 
    Literais de string em arquivos sem um comentário frozen_string_literalagora emitem um aviso de descontinuação quando são mutados. Esses avisos podem ser habilitados com-W:deprecatedou configurandoWarning[:deprecated] = true. Para desativar essa mudança, você pode executar o Ruby com o argumento de linha de comando--disable-frozen-string-literal. [Feature #20205]
- 
    O splatting de palavra-chave nilao chamar métodos agora é suportado.**nilé tratado de maneira semelhante a**{}, não passando palavras-chave, e não chamando nenhum método de conversão. [Bug #20064]
- 
    Passagem de bloco não é mais permitida em índice. [Bug #19918] 
- 
    Argumentos de palavra-chave não são mais permitidos em índice. [Bug #20218] 
- 
    O nome de nível superior ::Rubyagora está reservado, e a definição será avisada quandoWarning[:deprecated]. [Feature #20884]
Atualizações de classes principais
Nota: Estamos listando apenas atualizações notáveis das classes principais.
- 
    Exception - Exception#set_backtraceagora aceita um array de- Thread::Backtrace::Location.- Kernel#raise,- Thread#raisee- Fiber#raisetambém aceitam este novo formato. [Feature #13557]
 
- 
    GC - 
        GC.configadicionado para permitir a configuração de variáveis no Garbage Collector. [Feature #20443]
- 
        Parâmetro de configuração do GC rgengc_allow_full_markintroduzido. Quandofalseo GC marcará apenas objetos jovens. O padrão étrue. [Feature #20443]
 
- 
        
- 
    Ractor - 
        requireem Ractor é permitido. O processo de requisição será executado no Ractor principal.Ractor._require(feature)é adicionado para executar o processo de requisição no Ractor principal. [Feature #20627]
- 
        Ractor.main?é adicionado. [Feature #20627]
- 
        Ractor.[]eRactor.[]=são adicionados para acessar o armazenamento local do Ractor atual. [Feature #20715]
- 
        Ractor.store_if_absent(key){ init }é adicionado para inicializar variáveis locais do ractor de forma segura para threads. [Feature #20875]
 
- 
        
- 
    Range - Range#sizeagora levanta- TypeErrorse o intervalo não for iterável. [Misc #18984]
 
Atualizações da Biblioteca Padrão
Nota: Estamos listando apenas atualizações notáveis das bibliotecas padrão.
- RubyGems
    - Adicionada a opção --attestationao gem push. Ela permite armazenar a assinatura no sigstore.dev
 
- Adicionada a opção 
- Bundler
    - Adicionada uma configuração lockfile_checksumspara incluir checksums em novos arquivos lockfile.
- Adicionado bundle lock --add-checksumspara adicionar checksums a um arquivo lockfile existente
 
- Adicionada uma configuração 
- 
    JSON - Melhorias de desempenho do JSON.parsecerca de 1,5 vezes mais rápido que json-2.7.x.
 
- Melhorias de desempenho do 
- 
    Tempfile - O argumento de palavra-chave anonymous: truefoi implementado para Tempfile.create.Tempfile.create(anonymous: true)remove o arquivo temporário criado imediatamente. Assim, as aplicações não precisam remover o arquivo. [Feature #20497]
 
- O argumento de palavra-chave 
- 
    win32/sspi.rb - Esta biblioteca agora foi extraída do repositório Ruby para ruby/net-http-sspi. [Feature #20775]
 
Problemas de compatibilidade
Nota: Excluindo correções de bugs.
- As mensagens de erro e exibições de backtrace foram alteradas.
    - Usa uma aspa simples em vez de um acento grave como uma aspa de abertura. [Feature #16495]
- Exibe o nome de classe antes de um nome de método (somente quando a classe tiver um nome permanente). [Feature #19117]
- Kernel#caller, métodos de- Thread::Backtrace::Location, etc. também foram alterados de acordo.
 Antes: test.rb:1:in `foo': undefined method `time' for an instance of Integer from test.rb:2:in `<main>' Agora: test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer from test.rb:2:in '<main>'
- 
    A renderização de Hash#inspect foi alterada. [Bug #20433] - Chaves de símbolo são exibidas usando a sintaxe moderna de chave de símbolo: "{user: 1}"
- Outras chaves agora têm espaços ao redor de =>:'{"user" => 1}', enquanto anteriormente não tinham:'{"user"=>1}'
 
- Chaves de símbolo são exibidas usando a sintaxe moderna de chave de símbolo: 
- 
    Kernel#Float() agora aceita uma string decimal com a parte decimal omitida. [Feature #20705] Float("1.") #=> 1.0 (anteriormente, um ArgumentError era levantado) Float("1.E-1") #=> 0.1 (anteriormente, um ArgumentError era levantado)
- 
    String#to_f agora aceita uma string decimal com a parte decimal omitida. Note que o resultado muda quando um expoente é especificado. [Feature #20705] "1.".to_f #=> 1.0 "1.E-1".to_f #=> 0.1 (anteriormente, 1.0 era retornado)
- Refinement#refined_class foi removido. [Feature #19714]
Problemas de compatibilidade da biblioteca padrão
- 
    DidYouMean - DidYouMean::SPELL_CHECKERS[]=e- DidYouMean::SPELL_CHECKERS.merge!foram removidos.
 
- 
    Net::HTTP - Removidas as seguintes constantes obsoletas:
        - Net::HTTP::ProxyMod
- Net::NetPrivate::HTTPRequest
- Net::HTTPInformationCode
- Net::HTTPSuccessCode
- Net::HTTPRedirectionCode
- Net::HTTPRetriableCode
- Net::HTTPClientErrorCode
- Net::HTTPFatalErrorCode
- Net::HTTPServerErrorCode
- Net::HTTPResponseReceiver
- Net::HTTPResponceReceiver
 Essas constantes foram obsoletas desde 2012. 
 
- Removidas as seguintes constantes obsoletas:
        
- 
    Timeout - Rejeita valores negativos para Timeout.timeout. [Bug #20795]
 
- 
    URI - Alterado o parser padrão para compatível com RFC 3986 em vez de RFC 2396. [Bug #19266]
 
Atualizações da C API
- rb_newobje- rb_newobj_of(e macros correspondentes- RB_NEWOBJ,- RB_NEWOBJ_OF,- NEWOBJ,- NEWOBJ_OF) foram removidos. [Feature #20265]
- Removida a função obsoleta rb_gc_force_recycle. [Feature #18290]
Mudanças diversas
- 
    Passar um bloco para um método que não usa o bloco passado mostrará um aviso no modo verbose ( -w). [Feature #15554]
- 
    Redefinir alguns métodos principais que são especialmente otimizados pelo interpretador e JIT como String.freezeouInteger#+agora emite um aviso de classe de desempenho (-W:performanceouWarning[:performance] = true). [Feature #20429]
Veja NEWS ou logs de commits para mais detalhes.
Com essas mudanças, 4942 arquivos alterados, 202244 inserções(+), 255528 deleções(-) desde Ruby 3.3.0!
Feliz Natal, Boas Festas e aproveite a programação com Ruby 3.4!
Download
- 
    https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.gz TAMANHO: 23153022 SHA1: 8ccb561848a7c460ae08e1a120a47c4a88a79335 SHA256: 068c8523442174bd3400e786f4a6952352c82b1b9f6210fd17fb4823086d3379 SHA512: bc70ecba27d1cdea00879f03487cad137a7d9ab2ad376cfb7a65780ad14da637fa3944eeeede2c04ab31eeafb970c64ccfeeb854c99c1093937ecc1165731562
- 
    https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.tar.xz TAMANHO: 17215572 SHA1: eb25447cc404e8d2e177c62550d0224ebd410e68 SHA256: 0081930db22121eb997207f56c0e22720d4f5d21264b5907693f516c32f233ca SHA512: 776a2cf3e9ccc77c27500240f168aa3e996b0c7c1ee1ef5a7afc291a06c118444016fde38b5b139c0b800496b8eb1b5456562d833f0edc0658917164763b1af7
- 
    https://cache.ruby-lang.org/pub/ruby/3.4/ruby-3.4.0.zip TAMANHO: 28310193 SHA1: 26254ca5d3decc28a4e5faec255995265e5270b5 SHA256: c120228038af04554f6363e716b0a32cbf53cf63c6adf9f2c22a24f43dc8b555 SHA512: 4d535ed10db76a6aa74f8a025df319deb28483a7a781c24045906ee7663f1cff9d9f9e71dbc993c9e050113a34b37c7fa2143c355a0a6e1e1029bf2c92213ecc
O que é Ruby
Ruby foi desenvolvido pela primeira vez por Matz (Yukihiro Matsumoto) em 1993, e agora é desenvolvido como Open Source. Ele roda em várias plataformas e é usado em todo o mundo, especialmente para desenvolvimento web.