Ruby 4.0.0 Lançado
Escrito por naruse em 25/12/2025
Traduzido por guicruzzs
Estamos felizes em anunciar o lançamento do Ruby 4.0.0. Ruby 4.0 introduz o “Ruby Box” e o “ZJIT”, além de muitas melhorias.
Ruby Box
Ruby Box é um novo recurso (experimental) para fornecer separação de definições.
Ruby Box é habilitado quando a variável de ambiente RUBY_BOX=1 é especificada.
A classe é Ruby::Box.
Definições carregadas em uma box são isoladas dentro dela. Ruby Box pode isolar/separar monkey patches, alterações em variáveis globais/de classe, definições de classes/módulos e bibliotecas nativas/Ruby carregadas de outras boxes.
Casos de uso esperados incluem:
- Executar casos de teste em uma box para proteger outros testes quando o caso de teste usa monkey patches para sobrescrever algo
- Executar boxes de aplicações web em paralelo para fazer blue‑green deployment em um servidor de aplicação dentro de um processo Ruby
- Executar boxes de aplicações web em paralelo para avaliar atualizações de dependências por um certo período de tempo, verificando o diff da resposta usando código Ruby
- Ser usada como a API de base (baixo nível) para implementar algum tipo de API de “pacotes” (alto nível) (ainda não foi projetada)
Para mais detalhes sobre o “Ruby Box”, consulte
Ruby::Box.
[Feature #21311] [Misc #21385]
ZJIT
ZJIT é um novo compilador just‑in‑time (JIT), desenvolvido como a próxima geração do YJIT.
Você precisa do Rust 1.85.0 ou mais recente para construir o Ruby com suporte ao ZJIT, e
o ZJIT é habilitado quando --zjit é especificado.
Estamos construindo um novo compilador para Ruby porque queremos tanto elevar o teto de desempenho (unidade de compilação maior e IR em SSA) quanto incentivar mais contribuições externas (tornando‑se um compilador de métodos mais tradicional). Veja nosso post no blog para mais detalhes.
ZJIT é mais rápido que o interpretador, mas ainda não é tão rápido quanto o YJIT. Incentivamos você a experimentar o ZJIT, mas talvez seja melhor adiar o uso em produção por enquanto. Fique de olho no ZJIT do Ruby 4.1.
Melhorias em Ractor
Ractor, o mecanismo de execução paralela do Ruby, recebeu várias melhorias.
Uma nova classe, Ractor::Port, foi introduzida para resolver problemas relacionados
ao envio e recebimento de mensagens (veja
este post no blog).
Além disso, Ractor.shareable_proc facilita compartilhar objetos Proc entre Ractors.
Do ponto de vista de desempenho, muitas estruturas de dados internas foram melhoradas para reduzir significativamente a contenção em um lock global, liberando mais paralelismo. Ractors também agora compartilham menos dados internos, resultando em menos contenção de cache de CPU quando executados em paralelo.
Ractor foi introduzido pela primeira vez no Ruby 3.0 como um recurso experimental. Nosso objetivo é remover o status de “experimental” no próximo ano.
Mudanças na linguagem
-
*nilnão chama maisnil.to_a, de forma semelhante a como**nilnão chamanil.to_hash. [Feature #21047] -
Operadores lógicos binários (
||,&&,andeor) no início de uma linha continuam a linha anterior, assim como o encadeamento por ponto. Os exemplos de código a seguir são equivalentes:if condition1 && condition2 ... endAnteriormente:
if condition1 && condition2 ... endif condition1 && condition2 ... end
Atualizações de classes principais
Nota: Estamos listando apenas atualizações notáveis das classes principais.
-
Array
Array#rfindfoi adicionado como uma alternativa mais eficiente aarray.reverse_each.find. [Feature #21678]Array#findfoi adicionado como uma sobrescrita mais eficiente deEnumerable#find. [Feature #21678]
-
Binding
-
Binding#local_variablesnão inclui mais parâmetros numerados. Além disso,Binding#local_variable_get,Binding#local_variable_seteBinding#local_variable_defined?deixam de lidar com parâmetros numerados. [Bug #21049] -
Binding#implicit_parameters,Binding#implicit_parameter_geteBinding#implicit_parameter_defined?foram adicionados para acessar parâmetros numerados e o parâmetroit. [Bug #21049]
-
-
Enumerator
-
Enumerator.produceagora aceita um argumento de palavra‑chave opcionalsizepara especificar o tamanho do enumerador. Pode ser um inteiro,Float::INFINITY, um objeto chamável (como uma lambda) ounilpara indicar tamanho desconhecido. Quando não especificado, o tamanho padrão éFloat::INFINITY.# Enumerador infinito enum = Enumerator.produce(1, size: Float::INFINITY, &:succ) enum.size # => Float::INFINITY # Enumerador finito com tamanho conhecido/computável abs_dir = File.expand_path("./baz") # => "/foo/bar/baz" traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) { raise StopIteration if it == "/" File.dirname(it) } traverser.size # => 4
-
-
ErrorHighlight
-
Quando um
ArgumentErroré levantado, agora são exibidos trechos de código tanto da chamada de método (caller) quanto da definição de método (callee). [Feature #21543]test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError) caller: test.rb:3 | add(1) ^^^ callee: test.rb:1 | def add(x, y) = x + y ^^^ from test.rb:3:in '<main>'
-
-
Fiber
- Suporte ao argumento
Fiber#raise(cause:)foi introduzido, semelhante aKernel#raise. [Feature #21360]
- Suporte ao argumento
-
Fiber::Scheduler
-
Introduz
Fiber::Scheduler#fiber_interruptpara interromper um fiber com uma exceção específica. O caso de uso inicial é interromper um fiber que está aguardando uma operação de IO bloqueante quando essa operação é encerrada. [Feature #21166] -
Introduz
Fiber::Scheduler#yieldpara permitir que o escalonador de fibers continue processando quando exceções de sinal estão desabilitadas. [Bug #21633] -
Reintroduz o hook
Fiber::Scheduler#io_closeparaIO#closeassíncrono. -
Invoca
Fiber::Scheduler#io_writeao esvaziar o buffer de escrita de IO. [Bug #21789]
-
-
File
File::Stat#birthtimeagora está disponível no Linux via a chamada de sistemastatx, quando suportada pelo kernel e pelo sistema de arquivos. [Feature #21205]
-
IO
-
IO.selectaceitaFloat::INFINITYcomo argumento de timeout. [Feature #20610] -
Um comportamento obsoleto, criação de processos por métodos da classe
IOcom um|inicial, foi removido. [Feature #19630]
-
-
Kernel
-
Kernel#inspectagora verifica a existência de um método#instance_variables_to_inspect, permitindo controlar quais variáveis de instância são exibidas na string de#inspect:class DatabaseConfig def initialize(host, user, password) @host = host @user = user @password = password end private def instance_variables_to_inspect = [:@host, :@user] end conf = DatabaseConfig.new("localhost", "root", "hunter2") conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"> -
Um comportamento obsoleto, criação de processos por
Kernel#opencom um|inicial, foi removido. [Feature #19630]
-
-
Math
Math.log1peMath.expm1foram adicionados. [Feature #21527]
-
Pathname
Pathnamefoi promovida de gem padrão para classe principal do Ruby. [Feature #17473]
-
Proc
Proc#parametersagora mostra parâmetros opcionais anônimos como[:opt]em vez de[:opt, nil], tornando a saída consistente com o caso em que o parâmetro anônimo é obrigatório. [Bug #20974]
-
Ractor
-
A classe
Ractor::Portfoi adicionada como um novo mecanismo de sincronização para comunicação entre Ractors. [Feature #21262]port1 = Ractor::Port.new port2 = Ractor::Port.new Ractor.new port1, port2 do |port1, port2| port1 << 1 port2 << 11 port1 << 2 port2 << 12 end 2.times{ p port1.receive } #=> 1, 2 2.times{ p port2.receive } #=> 11, 12Ractor::Portfornece os seguintes métodos:Ractor::Port#receiveRactor::Port#send(ouRactor::Port#<<)Ractor::Port#closeRactor::Port#closed?
Como resultado,
Ractor.yieldeRactor#takeforam removidos. -
Ractor#joineRactor#valueforam adicionados para aguardar o término de um Ractor. São semelhantes aThread#joineThread#value. -
Ractor#monitoreRactor#unmonitorforam adicionados como interfaces de baixo nível usadas internamente para implementarRactor#join. -
Ractor.selectagora aceita apenas Ractors e Ports. Se Ractors forem fornecidos, retorna quando um Ractor termina. -
Ractor#default_portfoi adicionado. CadaRactorpossui uma porta padrão, usada porRactor.sendeRactor.receive. -
Ractor#close_incomingeRactor#close_outgoingforam removidos. -
Ractor.shareable_proceRactor.shareable_lambdaforam introduzidos para criarProcou lambda compartilháveis. [Feature #21550], [Feature #21557]
-
-
Range
-
Range#to_setagora realiza verificações de tamanho para evitar problemas com ranges infinitos. [Bug #21654] -
Range#overlap?agora lida corretamente com ranges infinitos (sem limites). [Bug #21185] -
O comportamento de
Range#maxem ranges inteiros sem início foi corrigido. [Bug #21174] [Bug #21175]
-
-
Ruby
- Um novo módulo de nível superior
Rubyfoi definido, contendo constantes relacionadas ao Ruby. Este módulo foi reservado no Ruby 3.4 e agora é oficialmente definido. [Feature #20884]
- Um novo módulo de nível superior
-
Ruby::Box
- Um novo recurso (experimental) para fornecer separação de definições. Para mais detalhes sobre o “Ruby Box”, veja doc/language/box.md. [Feature #21311] [Misc #21385]
-
Set
-
Setagora é uma classe principal, em vez de uma classe da biblioteca padrão carregada sob demanda. [Feature #21216] -
Set#inspectagora usa uma forma de exibição mais simples, semelhante a arrays literais (por exemplo,Set[1, 2, 3]em vez de#<Set: {1, 2, 3}>). [Feature #21389] -
Passar argumentos para
Set#to_seteEnumerable#to_setagora é desencorajado (deprecated). [Feature #21390]
-
-
Socket
-
Socket.tcpeTCPSocket.newaceitam um argumento de palavra‑chaveopen_timeoutpara especificar o timeout da conexão inicial. [Feature #21347] -
Quando um timeout especificado pelo usuário ocorria em
TCPSocket.new, anteriormente podiam ser levantadasErrno::ETIMEDOUTouIO::TimeoutError, dependendo da situação. Esse comportamento foi unificado para que agoraIO::TimeoutErrorseja sempre levantado. (Observe que, emSocket.tcp, ainda podem existir casos em queErrno::ETIMEDOUTseja levantada em situações semelhantes, e que, em ambos os casos,Errno::ETIMEDOUTpode ser levantada quando o timeout ocorre no nível do sistema operacional.)
-
-
String
-
Atualização do Unicode para a versão 17.0.0 e do Emoji para a versão 17.0. [Feature #19908][Feature #20724][Feature #21275] (também se aplica a
Regexp) -
String#strip,strip!,lstrip,lstrip!,rstriperstrip!foram estendidos para aceitar argumentos*selectors. [Feature #21552]
-
-
Thread
- Suporte ao argumento
Thread#raise(cause:)foi introduzido, semelhante aKernel#raise. [Feature #21360]
- Suporte ao argumento
Atualizações da Biblioteca Padrão
Listamos aqui apenas mudanças na biblioteca padrão que são alterações de recurso notáveis.
Outras mudanças estão listadas nas seções seguintes. Também listamos o histórico de lançamentos desde a versão anterior empacotada, Ruby 3.4.0, quando há releases no GitHub.
As seguintes gems empacotadas foram promovidas de gems padrão:
- ostruct 0.6.3
- pstore 0.2.0
- 0.1.4 até v0.2.0
- benchmark 0.5.0
- logger 1.7.0
- rdoc 7.0.2
- win32ole 1.9.2
- 1.9.1 até v1.9.2
- irb 1.16.0
- reline 0.6.3
- readline 0.0.4
- fiddle 1.1.8
As seguintes gems padrão foram adicionadas:
- win32-registry 0.1.2
As seguintes gems padrão foram atualizadas:
- RubyGems 4.0.3
- bundler 4.0.3
- date 3.5.1
- delegate 0.6.1
- digest 3.2.1
- 3.2.0 até v3.2.1
- english 0.8.1
- 0.8.0 até v0.8.1
- erb 6.0.1
- error_highlight 0.7.1
- etc 1.4.6
- fcntl 1.3.0
- 1.2.0 até v1.3.0
- fileutils 1.8.0
- 1.7.3 até v1.8.0
- forwardable 1.4.0
- 1.3.3 até v1.4.0
- io-console 0.8.2
- 0.8.1 até v0.8.2
- io-nonblock 0.3.2
- io-wait 0.4.0
- 0.3.2 até v0.3.3, v0.3.5.test1, v0.3.5, v0.3.6, v0.4.0
- ipaddr 1.2.8
- json 2.18.0
- net-http 0.9.1
- openssl 4.0.0
- optparse 0.8.1
- pp 0.6.3
- 0.6.2 até v0.6.3
- prism 1.7.0
- psych 5.3.1
- resolv 0.7.0
- stringio 3.2.0
- strscan 3.1.6
- time 0.4.2
- 0.4.1 até v0.4.2
- timeout 0.6.0
- uri 1.1.1
- weakref 0.1.4
- 0.1.3 até v0.1.4
- zlib 3.2.2
- 3.2.1 até v3.2.2
As seguintes gems empacotadas foram atualizadas:
- minitest 6.0.0
- power_assert 3.0.1
- rake 13.3.1
- test-unit 3.7.5
- rexml 3.4.4
- rss 0.3.2
- 0.3.1 até 0.3.2
- net-ftp 0.3.9
- 0.3.8 até v0.3.9
- net-imap 0.6.2
- net-smtp 0.5.1
- 0.5.0 até v0.5.1
- matrix 0.4.3
- 0.4.2 até v0.4.3
- prime 0.1.4
- 0.1.3 até v0.1.4
- rbs 3.10.0
- 3.8.0 até v3.8.1, v3.9.0.dev.1, v3.9.0.pre.1, v3.9.0.pre.2, v3.9.0, v3.9.1, v3.9.2, v3.9.3, v3.9.4, v3.9.5, v3.10.0.pre.1, v3.10.0.pre.2, v3.10.0
- typeprof 0.31.1
- debug 1.11.1
- 1.11.0 até v1.11.1
- base64 0.3.0
- 0.2.0 até v0.3.0
- bigdecimal 4.0.1
- drb 2.2.3
- 2.2.1 até v2.2.3
- syslog 0.3.0
- 0.2.0 até v0.3.0
- csv 3.3.5
- repl_type_completor 0.1.12
RubyGems e Bundler
Ruby 4.0 empacota RubyGems e Bundler versão 4. Veja os links a seguir para mais detalhes.
- Upgrading to RubyGems/Bundler 4 - RubyGems Blog
- 4.0.0 Released - RubyGems Blog
- 4.0.1 Released - RubyGems Blog
- 4.0.2 Released - RubyGems Blog
- 4.0.3 Released - RubyGems Blog
Plataformas suportadas
-
Windows
- Suporte a versões do MSVC anteriores a 14.0 (_MSC_VER 1900) foi removido. Isso significa que o Visual Studio 2015 ou mais recente agora é obrigatório.
Problemas de compatibilidade
-
Os seguintes métodos foram removidos de
Ractordevido à adição deRactor::Port:Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoing
-
ObjectSpace._id2refestá obsoleto. [Feature #15408] -
Process::Status#&eProcess::Status#>>foram removidos. Eles foram marcados como obsoletos no Ruby 3.3. [Bug #19868] -
rb_path_checkfoi removida. Essa função era usada para verificação de caminhos com$SAFE, que foi removida no Ruby 2.7, e já estava obsoleta. [Feature #20971] -
Um backtrace para
ArgumentErrorde “wrong number of arguments” agora inclui o nome da classe ou módulo do receiver (por exemplo, emFoo#barem vez de apenasbar). [Bug #21698] -
Backtraces não exibem mais frames
internal. Esses métodos agora aparecem como se estivessem no arquivo de código Ruby, consistente com outros métodos implementados em C. [Bug #20968]Antes:
ruby -e '[1].fetch_values(42)' <internal:array>:211:in 'Array#fetch': index 42 outside of array bounds: -1...1 (IndexError) from <internal:array>:211:in 'block in Array#fetch_values' from <internal:array>:211:in 'Array#map!' from <internal:array>:211:in 'Array#fetch_values' from -e:1:in '<main>'Depois:
$ ruby -e '[1].fetch_values(42)' -e:1:in 'Array#fetch_values': index 42 outside of array bounds: -1...1 (IndexError) from -e:1:in '<main>'
Problemas de compatibilidade da biblioteca padrão
-
A biblioteca
CGIfoi removida das gems padrão. Agora fornecemos apenascgi/escapepara os seguintes métodos:CGI.escapeeCGI.unescapeCGI.escapeHTMLeCGI.unescapeHTMLCGI.escapeURIComponenteCGI.unescapeURIComponentCGI.escapeElementeCGI.unescapeElement
-
Com a mudança de
Setda biblioteca padrão para classe principal,set/sorted_set.rbfoi removido eSortedSetnão é mais uma constante carregada sob demanda. Por favor, instale a gemsorted_sete façarequire 'sorted_set'para usarSortedSet. [Feature #21287] -
Net::HTTP
- O comportamento padrão de configurar automaticamente o cabeçalho
Content-Typecomoapplication/x-www-form-urlencodedpara requisições com corpo (por exemplo,POST,PUT) quando o cabeçalho não era definido explicitamente foi removido. Se sua aplicação dependia desse padrão automático, agora as requisições serão enviadas sem um cabeçalhoContent-Type, o que pode quebrar compatibilidade com alguns servidores. [GH-net-http #205]
- O comportamento padrão de configurar automaticamente o cabeçalho
Atualizações da C API
-
IO
rb_thread_fd_closeestá obsoleta e agora é um no‑op. Se você precisar expor descritores de arquivo de extensões C para código Ruby, crie uma instância deIOusandoRUBY_IO_MODE_EXTERNALe userb_io_close(io)para fechá‑la (isso também interrompe e aguarda todas as operações pendentes na instância deIO). Fechar descritores de arquivo diretamente não interrompe operações pendentes e pode levar a comportamento indefinido. Em outras palavras, se dois objetosIOcompartilham o mesmo descritor de arquivo, fechar um não afeta o outro. [Feature #18455]
-
GVL
rb_thread_call_with_gvlagora funciona com ou sem o GVL. Isso permite que gems evitem verificarruby_thread_has_gvl_p. Ainda assim, é importante ser cuidadoso com o GVL. [Feature #20750]
-
Set
-
Uma API em C para
Setfoi adicionada. Os seguintes métodos são suportados: [Feature #21459]rb_set_foreachrb_set_newrb_set_new_caparb_set_lookuprb_set_addrb_set_clearrb_set_deleterb_set_size
-
Melhorias na implementação
Class#new(por exemplo,Object.new) está mais rápido em todos os casos, mas especialmente ao passar argumentos de palavra‑chave. Isso também foi integrado ao YJIT e ao ZJIT. [Feature #21254]- Heaps do GC de pools de tamanhos diferentes agora crescem de forma independente, reduzindo o uso de memória quando apenas alguns pools contêm objetos de vida longa.
- A varredura (sweeping) do GC está mais rápida em páginas de objetos grandes.
- Objetos de “generic ivar” (String, Array,
TypedData, etc.) agora usam um novo objeto interno de “fields” para acesso mais rápido a variáveis de instância. - O GC evita manter uma tabela interna
id2refaté que seja usada pela primeira vez, tornando a alocação deobject_ide a varredura do GC mais rápidas. object_idehashestão mais rápidos em objetosClasseModule.- Inteiros bignum maiores agora podem permanecer embutidos usando alocação de largura variável.
Random,Enumerator::Product,Enumerator::Chain,Addrinfo,StringScannere alguns objetos internos agora são protegidos por write‑barrier, o que reduz a sobrecarga do GC.
Ractor
Muito trabalho foi feito para tornar Ractors mais estáveis, performáticos e utilizáveis. Essas melhorias aproximam a implementação de Ractor de deixar o status experimental.
- Melhorias de desempenho
- Strings congeladas e a tabela de símbolos usam internamente um hash set lock‑free. [Feature #21268]
- A busca no cache de métodos evita bloqueios na maioria dos casos.
- O acesso a variáveis de instância de classes (e generic ivar) está mais rápido e evita bloqueios.
- A contenção de cache de CPU é evitada na alocação de objetos usando um contador por Ractor.
- A contenção de cache de CPU é evitada em
xmalloc/xfreeusando um contador local à thread. object_idevita bloqueios na maioria dos casos.
- Correções de bugs e estabilidade
- Correções de deadlocks potenciais ao combinar Ractors e Threads.
- Correções em problemas com
requireeautoloadem Ractor. - Correções em problemas de codificação/transcodificação entre Ractors.
- Correções em condições de corrida em operações do GC e invalidação de métodos.
- Correções em problemas com processos que fazem fork após iniciar um Ractor.
- Contagens de alocação do GC agora são precisas sob Ractors.
- Correção de TracePoints que não funcionavam após o GC. [Bug #19112]
JIT
- ZJIT
- Introduz um compilador JIT baseado em métodos
experimental. Onde disponível, o ZJIT pode ser habilitado em tempo de execução
com a opção
--zjitou chamandoRubyVM::ZJIT.enable. Ao compilar o Ruby, é necessário Rust 1.85.0 ou mais recente para incluir suporte ao ZJIT. - A partir do Ruby 4.0.0, o ZJIT é mais rápido que o interpretador, mas ainda não é tão rápido quanto o YJIT. Incentivamos a experimentação com o ZJIT, mas recomendamos não usá‑lo em produção por enquanto.
- Nosso objetivo é tornar o ZJIT mais rápido que o YJIT e pronto para produção no Ruby 4.1.
- Introduz um compilador JIT baseado em métodos
experimental. Onde disponível, o ZJIT pode ser habilitado em tempo de execução
com a opção
- YJIT
RubyVM::YJIT.runtime_statsratio_in_yjitnão funciona mais na build padrão. Use--enable-yjit=statsemconfigurepara habilitá‑lo com--yjit-stats.- Adiciona
invalidate_everythingàs estatísticas padrão, que é incrementada quando todo o código é invalidado por TracePoint.
- Adiciona opções
mem_size:ecall_threshold:aRubyVM::YJIT.enable.
- RJIT
--rjitfoi removido. A implementação da API de JIT de terceiros será movida para o repositório ruby/rjit.
Veja NEWS ou logs de commits para mais detalhes.
Com essas mudanças, 3889 arquivos alterados, 230769 inserções(+), 297003 deleções(-) desde Ruby 3.4.0!
Feliz Natal, um Próspero Ano Novo e aproveite a programação com Ruby 4.0!
Download
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz
TAMANHO: 23955109 SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3 SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271 SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz
TAMANHO: 18008368 SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602 SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1 SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip
TAMANHO: 29253204 SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8 SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455 SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302
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.
Notícias Recentes
Ruby 3.2.10 lançado
Ruby 3.2.10 foi lançado.
Escrito por hsbt em 14/01/2026
Ruby 4.0.1 Lançado
Ruby 4.0.1 foi lançado.
Escrito por k0kubun em 13/01/2026
Ruby 3.4.2 Lançado
Ruby 3.4.2 foi lançado.
Escrito por k0kubun em 14/02/2025
Ruby 3.2.7 Lançado
Ruby 3.2.7 foi lançado.
Escrito por nagachika em 04/02/2025