Publicado Ruby 4.0.0 preview3

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

  • *nil ya no llama a nil.to_a, de forma similar a como **nil no llama a nil.to_hash. [Característica #21047]

  • Los operadores binarios lógicos (||, &&, and and or) 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
        ...
      end
    
      if condicion1 && condicion2
        ...
      end
    

    [Característica #20925]

Actualizaciones a las clases principales

Nota: Sólo listamos actualizaciones mayores a clases.

  • Kernel

  • Kernel#inspect ahora 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">

[Característica #21219]

  • Se eliminó un comportamiento obsoleto: la creación de procesos mediante Kernel#open con un | inicial. [Característica #19630]

  • Binding

  • Binding#local_variables ya no incluye parámetros numerados. Además, Binding#local_variable_get y Binding#local_variable_set rechazan manejar parámetros numerados. [[Error #21049]]

  • File

  • File::Stat#birthtime ahora 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.select acepta Float::INFINITY como argumento de tiempo de espera. [Característica #20610]

  • Se eliminó un comportamiento obsoleto: la creación de procesos mediante métodos de clase IO con un | inicial. [Característica #19630]

  • Math

  • Se agregaron Math.log1p y Math.expm1. [Característica #21527]

  • Method

  • Method#source_location, Proc#source_location y UnboundMethod#source_location ahora 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#parameters ahora 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::Port para 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#receive
  • Ractor::Port#send (o Ractor::Port#<<)
  • Ractor::Port#close
  • Ractor::Port#closed?

Como resultado, se eliminaron Ractor.yield y Ractor#take.

  • Se agregaron Ractor#join y Ractor#value para esperar la finalización de un Ractor. Estos son similares a Thread#join y Thread#value.

  • Se agregaron Ractor#monitor y Ractor#unmonitor como interfaces de bajo nivel utilizadas internamente para implementar Ractor#join.

  • Ractor.select ahora solo acepta Ractors y Ports. Si se proporcionan Ractors, devuelve un valor cuando un Ractor finaliza.

  • Se agregó Ractor#default_port. Cada Ractor tiene un puerto predeterminado, que es utilizado por Ractor.send y Ractor.receive. * Se eliminaron Ractor#close_incoming y Ractor#close_outgoing.

  • Se introdujeron Ractor.shareable_proc y Ractor.shareable_lambda para crear objetos Proc o lambda compartibles. [Característica #21550], [Característica #21557]

  • Range

  • Range#to_set y Enumerator#to_set ahora 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#max en 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

  • Set ahora es una clase principal, en lugar de una clase de la biblioteca estándar de carga automática. [Característica #21216]

  • Set#inspect ahora devuelve una cadena adecuada para eval, utilizando la sintaxis Set[] (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_set y Enumerable#to_set ahora está obsoleto. [Característica #21390]

  • Socket

JIT

  • ZJIT
    • Se agregó un compilador JIT experimental basado en métodos. Use --enable-zjit en configure para 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.
  • YJIT
    • Estadísticas de YJIT
      • ratio_in_yjit ya no funciona en la compilación predeterminada. Use --enable-yjit=stats en configure para habilitarlo con --yjit-stats.
      • Se agregó invalidate_everything a las estadísticas predeterminadas, que se incrementa cuando TracePoint invalida todo el código.
    • Se agregaron las opciones mem_size: y call_threshold: a RubyVM::YJIT.enable.
  • RJIT
    • Se eliminó --rjit. Trasladaremos la implementación de la API JIT de terceros al repositorio ruby/rjit.
  • 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.
  • YJIT
    • RubyVM::YJIT.runtime_stats
      • ratio_in_yjit ya no funciona en la compilación predeterminada. Use --enable-yjit=stats en configure para habilitarlo con --yjit-stats.
      • Se agregó invalidate_everything a las estadísticas predeterminadas, que se incrementa cuando TracePoint invalida todo el código.
    • Se agregaron las opciones mem_size: y call_threshold: a RubyVM::YJIT.enable.
  • RJIT
    • Se eliminó --rjit. Trasladaremos la implementación de la API JIT de terceros al repositorio ruby/rjit.

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.