Publicado por naruse el 2025-12-18
Traducción de vtamara
Nos complace anunciar la publicación de Ruby 4.0.0-preview3. Ruby 4.0 introduce Ruby::BOX y “ZJIT”, y agrega muchas mejoras.
Ruby::BOX
Una nueva característica (experimental) para dar separación en definiciones. Vea detalles de “Ruby Box” en doc/language/box.md. [Característica #21311] [Misc #21385]
Cambios en el lenguaje
-
*nilya no llama anil.to_a, de forma similar a como**nilno llama anil.to_hash. [Característica #21047] -
Los operadores binarios lógicos (
||,&&,andandor) al comienzo de una línea continúan la línea anterior, cómo un punto fluido. Los siguientes dos códigos son iguales:if condicion1 && condicion2 ... endif condicion1 && condicion2 ... end
Actualizaciones a las clases principales
Nota: Sólo listamos actualizaciones mayores a clases.
-
Kernel
-
Kernel#inspectahora comprueba la existencia del método#instance_variables_to_inspect, lo que permite controlar qué variables de instancia se muestran en la cadena#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">
-
Se eliminó un comportamiento obsoleto: la creación de procesos mediante
Kernel#opencon un|inicial. [Característica #19630] -
Binding
-
Binding#local_variablesya no incluye parámetros numerados. Además,Binding#local_variable_getyBinding#local_variable_setrechazan manejar parámetros numerados. [[Error #21049]] -
File
-
File::Stat#birthtimeahora está disponible en Linux a través de la llamada al sistema statx cuando el kernel y el sistema de archivos lo admiten. [Característica #21205] -
IO
-
IO.selectaceptaFloat::INFINITYcomo argumento de tiempo de espera. [Característica #20610] -
Se eliminó un comportamiento obsoleto: la creación de procesos mediante métodos de clase
IOcon un|inicial. [Característica #19630] -
Math
-
Se agregaron
Math.log1pyMath.expm1. [Característica #21527] -
Method
-
Method#source_location,Proc#source_locationyUnboundMethod#source_locationahora devuelven información de ubicación extendida con 5 elementos:[ruta, línea_inicio, columna_inicio, línea_fin, columna_fin]. El formato anterior de dos elementos[ruta, línea]aún se puede obtener llamando a.take(2)sobre el resultado. [Característica #6012] -
Proc
-
Proc#parametersahora muestra los parámetros opcionales anónimos como[:opt]en lugar de[:opt, nil], lo que hace que la salida sea coherente con el caso en que el parámetro anónimo es obligatorio. [[Error #20974]] -
Ractor
-
Se agregó la clase
Ractor::Portpara un nuevo mecanismo de sincronización para la comunicación entre Ractors. [Característica #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, 12
Ractor::Port proporciona los siguientes métodos:
Ractor::Port#receiveRactor::Port#send(oRactor::Port#<<)Ractor::Port#closeRactor::Port#closed?
Como resultado, se eliminaron Ractor.yield y Ractor#take.
-
Se agregaron
Ractor#joinyRactor#valuepara esperar la finalización de un Ractor. Estos son similares aThread#joinyThread#value. -
Se agregaron
Ractor#monitoryRactor#unmonitorcomo interfaces de bajo nivel utilizadas internamente para implementarRactor#join. -
Ractor.selectahora solo acepta Ractors y Ports. Si se proporcionan Ractors, devuelve un valor cuando un Ractor finaliza. -
Se agregó
Ractor#default_port. CadaRactortiene un puerto predeterminado, que es utilizado porRactor.sendyRactor.receive. * Se eliminaronRactor#close_incomingyRactor#close_outgoing. -
Se introdujeron
Ractor.shareable_procyRactor.shareable_lambdapara crear objetos Proc o lambda compartibles. [Característica #21550], [Característica #21557] -
Range
-
Range#to_setyEnumerator#to_setahora realizan comprobaciones de tamaño para evitar problemas con rangos infinitos. [Falla #21654] -
Range#overlap?ahora maneja correctamente los rangos infinitos (sin límites). [Falla #21185] -
Se corrigió el comportamiento de
Range#maxen rangos de enteros sin límite inferior. [Falla #21174] [Falla #21175] -
Ruby
-
Se ha definido un nuevo módulo de nivel superior
Ruby, que contiene constantes relacionadas con Ruby. Este módulo estaba reservado en Ruby 3.4 y ahora está definido oficialmente. [Característica #20884] -
Ruby::Box
-
Una nueva característica (experimental) para proporcionar separación entre definiciones. Para obtener detalles sobre “Ruby Box”, consulte doc/language/box.md. [Característica #21311] [Misc #21385]
-
Set
-
Setahora es una clase principal, en lugar de una clase de la biblioteca estándar de carga automática. [Característica #21216] -
Set#inspectahora devuelve una cadena adecuada paraeval, utilizando la sintaxisSet[](por ejemplo,Set[1, 2, 3]en lugar de#<Set: {1, 2, 3}>). Esto lo hace coherente con otras clases de colecciones principales como Array y Hash. [Característica #21389] -
Pasar argumentos a
Set#to_setyEnumerable#to_setahora está obsoleto. [Característica #21390] -
Socket
JIT
- ZJIT
- Se agregó un compilador JIT experimental basado en métodos.
Use
--enable-zjitenconfigurepara habilitar el soporte--zjit. - A partir de Ruby 4.0.0-preview2, ZJIT aún no está listo para acelerar la mayoría de los benchmarks. Por favor, absténgase de evaluar ZJIT por el momento. Manténgase atento al lanzamiento de Ruby 4.0.
- Se agregó un compilador JIT experimental basado en métodos.
Use
- YJIT
- Estadísticas de YJIT
ratio_in_yjitya no funciona en la compilación predeterminada. Use--enable-yjit=statsenconfigurepara habilitarlo con--yjit-stats.- Se agregó
invalidate_everythinga las estadísticas predeterminadas, que se incrementa cuando TracePoint invalida todo el código.
- Se agregaron las opciones
mem_size:ycall_threshold:aRubyVM::YJIT.enable.
- Estadísticas de YJIT
- RJIT
- Se eliminó
--rjit. Trasladaremos la implementación de la API JIT de terceros al repositorio ruby/rjit.
- Se eliminó
- ZJIT
- Se introduce un compilador JIT experimental basado en métodos.
Para habilitar soporte
--zjit, compile Ruby con Rust 1.85.0 o posterior. - En Ruby 4.0.0, ZJIT es tan rápido como el interprete, pero aún no tan rápido como YJIT. Animamos a experimentar con ZJIT, pero advertimos no desplegarlo en producción por ahora.
- Nuestra meta es hacer ZJIT más rápido que YJIT y listo para producción en Ruby 4.1.
- Se introduce un compilador JIT experimental basado en métodos.
Para habilitar soporte
- YJIT
RubyVM::YJIT.runtime_statsratio_in_yjitya no funciona en la compilación predeterminada. Use--enable-yjit=statsenconfigurepara habilitarlo con--yjit-stats.- Se agregó
invalidate_everythinga las estadísticas predeterminadas, que se incrementa cuando TracePoint invalida todo el código.
- Se agregaron las opciones
mem_size:ycall_threshold:aRubyVM::YJIT.enable.
- RJIT
- Se eliminó
--rjit. Trasladaremos la implementación de la API JIT de terceros al repositorio ruby/rjit.
- Se eliminó
Cambios varios
Consulte NEWS o leregistro de commits para obtener más detalles.
Con estos cambios, ¡3776 archivos modificados, 222800 inserciones (+), 293617 eliminaciones (-) desde Ruby 3.4.0!
Descargas
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.gz
SIZE: 23865890 SHA1: a348f196e0314d8863ae5d5f0a588a37c52aa89c SHA256: 43d0926e776fbd5599adcc7bccb4ccc804e109f402a2068607a2a86562c2cdc0 SHA512: 1c7f10405832646eceacb278ea7cc3445dc0e1778e9a9331062f2fb0164d45ba5af0b4244dc6ae46e36730d6cafb4c4196fbd4f4fb74029afde5ecf4fd433a6b -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.xz
SIZE: 17915004 SHA1: b7b99831558b9cd6cf8fb148f07cd4e8e59d9e99 SHA256: 8d7a503b2c4abcfacf0fa54ac56d37f7dd6d643a3a717661729cabbe947610a6 SHA512: b046c015a58daafb1640d8db62a36ebf64c7f83fbfb033fa327458afab6e9c31b1c2b194b347fd63f16e413e732d3e6ac20076282b433ef16923343c9ed84aa1 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.zip
SIZE: 29403010 SHA1: 689cb6c497afb96d26745708e772b63afca52e1a SHA256: c29147727a8eacf01b942012e3d6fa26010f98f43f6ab249c391f47c744f44cf SHA512: c07d6069b391e38ec99725201d021998ccfb913423636f729eccd0cff17cb9ab7e8565f46d68eea96cf7f546cee647892ca3f37b720a202e8e5496cd10dd168b
What is Ruby
Ruby fue desarrollado por primera vez por Matz (Yukihiro Matsumoto) en 1993, y actualmente se desarrolla como software de código abierto. Se ejecuta en múltiples plataformas y se utiliza en todo el mundo, especialmente para el desarrollo web.