Documentation for a newer release is available. View Latest

Ruby

Ruby 2.7

Fedora 32 proporciona la versión 2.7 de Ruby. Con esta actualización mayor desde Ruby 2.6, Fedora se vuelve en la plataforma de desarrollo superior de Ruby.

Cambios desde Ruby 2.6:

Ruby 2.7 viene con varias características nuevas y mejoras en el rendimiento.

Mejoras de rendimiento

  • JIT [Experimental]

  • Estrategia de caché de fibra es modificada y la creación de fibra es acelerada.

  • Module#name, true.to_s, false.to_s, y nil.to_s ahora siempre devuelve un String congelado. El String revuelto siempre es el mismo para un objeto dado. [Experimental]

  • El rendimiento de Monitor y MonitorMixin ha sido mejorado.

  • El rendimiento de CGI.escapeHTML ha mejorado.

  • Caché de método Per-call-site, la cual ha sido allí desde 1.9 más o menos, fue mejorado: tasa de caché lograda elevada desde 89% a 90%.

  • El método RubyVM::InstructionSequence#to_binary genera binarios compilado. El tamaño binario está reducido.

Otros cambios notables

  • Se han actualizado las bibliotecas estándar.

    • Bundler 2.1.2

    • RubyGems 3.1.2

    • Racc 1.4.15

    • CSV 3.1.2

    • REXML 3.2.3

    • RSS 0.2.8

    • StringScanner 1.0.3

    • Algunas otras bibliotecas que no tengan versión original además son mejoradas.

  • Las siguientes bibliotecas ya no son gemas empaquetadas. Instale las gemas correspondientes para utilizar estas características.

    • CMath (cmath gem)

    • Scanf (scanf gem)

    • Intérprete (intérprete gem)

    • Synchronizer (sync gem)

    • ThreadsWait (thwait gem)

    • E2MM (e2mmap gem)

  • profile.rb fue retirado desde biblioteca estándar.

  • Promote stdlib to default gems

    • The following default gems were published on rubygems.org

      • banco de pruebas

      • cgi

      • delegate

      • getoptlong

      • net-pop

      • net-smtp

      • open3

      • pstore

      • singleton

    • Las siguiente gemas por defecto solo fueron promovidas en rubi-core, pero todavía no publicado en rubygems.org.

      • monitor

      • observer

      • timeout

      • tracer

      • uri

      • yaml

  • Proc.new y proc sin ningún bloque en un método invocado con un bloque ahora es advertido.

  • lambda sin ningún bloque en un método invocado con un bloque eleva una excepción.

  • Actualiza la versión de Unicode y la versión de Emoji desde 11.0.0 a 12.0.0.

  • Actualiza la versión de Unicode a 12.1.0, añadiendo soporte para U+32FF SQUARE ERA NAME REIWA.

  • Date.jisx0301, Date#jisx0301, y Date.parse admite la era nueva de japonés.

  • Requiere compiladores para soporte con C99.

Cambios detallados

Coincidencia de Patrón [Experimental]

Coincidencia de patrón, una característica ampliamente utilizada en lenguajes de programación funcional, es introducida como una característica experimental. Puede cruzar un objeto dado y asignar su valor si coincide con un patrón.

requiere "json"

json = <<END
{
  "name": "Alice",
  "age": 30,
  "children": [{ "name": "Bob", "age": 2 }]
}
END

case JSON.parse(json, symbolize_names: true)
in {name: "Alice", children: [{name: "Bob", age: age}]}
  p age #=> 2
end

Mejora en REPL

irb, el entorno interactivo empaquetado (REPL; Read-Eval-Print-Loop), ahora admite edición multi‐hilo. Esto está impulsado por reline, un readline - una biblioteca compatible implementada en Ruby puro. Además proporciona integración rdoc. En irb puede exhibir la referencia para una clase, módulo o método dado.

Compactación GC

Esta versión introduce Compaction GC lo cual puede desfragmentar un espacio de memoria fragmentado.

Algunos programas de multi‐hilo de Ruby pueden causar fragmentación de memoria, llegando a un uso de memoria alto y velocidad degradada.

El método GC.compact es introducido para compactar la cabeza. Esta función compacta objetos en vivo en la cabecera tal que pueden utilizarse menos páginas, y la cabecera puede ser más amigable al CoW (copiar-al-escribir).

Separación de argumentos posicionales y teclado

Conversión automática de argumentos de argumentos de palabra clave y argumentos posicionales están obsoletos, y conversión será retirada en Ruby 3.

Cambios
  • Cuando una invocación de método aprueba un Hash en el último argumento, y cuando no pasa ninguna palabra clave, y cuando el método invocado acepta las palabras clave, se emite una advertencia. Para continuar tratando el hash como palabras clave, y un operador de salpicadura doble para evitar la advertencia y asegurar comportamiento correcto en Ruby 3.

        def foo(key: 42); end; foo({key: 42})   # advertido
        def foo(**kw);    end; foo({key: 42})   # advertido
        def foo(key: 42); end; foo(**{key: 42}) # OK
        def foo(**kw);    end; foo(**{key: 42}) # OK
  • Cuando una invocación a un método pasa palabras clave a un método que acepta palabras clave, pero no pasa suficientes argumentos posicionales requeridos, las palabras clave se tratan como un argumento posicional final obligatorio y se emite una advertencia. Para evitar la advertencia y garantizar un comportamiento correcto en Ruby 3, pase el argumento como un hash en lugar de palabras clave.

        def foo(h, **kw); end; foo(key: 42)      # advertencia
        def foo(h, key: 42); end; foo(key: 42)   # advertencia
        def foo(h, **kw); end; foo({key: 42})    # OK
        def foo(h, key: 42); end; foo({key: 42}) # OK
  • When a method accepts specific keywords but not a keyword splat, and a hash or keywords splat is passed to the method that includes both Symbol and non-Symbol keys, the hash will continue to be split, and a warning will be emitted. You will need to update the calling code to pass separate hashes to ensure correct behavior in Ruby 3.

        def foo(h={}, key: 42); end; foo("key" => 43, key: 42)   # warned
        def foo(h={}, key: 42); end; foo({"key" => 43, key: 42}) # warned
        def foo(h={}, key: 42); end; foo({"key" => 43}, key: 42) # OK
  • Si un método no acepta palabras clave, y se invoca con palabras clave, las palabras clave aún son tratadas como hash posicionales, sin advertir. Este comportamiento continuará funcionando en Ruby 3.

        def foo(opt={});  end; foo( key: 42 )   # Correcto
  • Se conceden distintos de símbolos como claves de argumento con palabra clave si el método aceptar palabras clave arbitrarias.

        def foo(**kw); p kw; end; foo("str" => 1) #=> {"str"=>1}
  • **nil se permite en las definiciones de métodos para indicar explícitamente que el método no acepta palabras clave. Llamar a dicho método con palabras clave dará como resultado un ArgumentError.

        def foo(h, **nil); end; foo(key: 1)       # ArgumentError
        def foo(h, **nil); end; foo(**{key: 1})   # ArgumentError
        def foo(h, **nil); end; foo("str" => 1)   # ArgumentError
        def foo(h, **nil); end; foo({key: 1})     # OK
        def foo(h, **nil); end; foo({"str" => 1}) # OK
  • Passing an empty keyword splat to a method that does not accept keywords no longer passes an empty hash, unless the empty hash is necessary for a required parameter, in which case a warning will be emitted. Remove the double splat to continue passing a positional hash.

        h = {}; def foo(*a) a end; foo(**h) # []
        h = {}; def foo(a) a end; foo(**h)  # {} y avisando
        h = {}; def foo(*a) a end; foo(h)   # [{}]
        h = {}; def foo(a) a end; foo(h)    # {}

Si quieres deshabilitar el deprecation avisos, utilice un argumento de línea de comando -W:no-deprecated o añadir Warning[:deprecated] = false a vuestro código.

Consulte el anuncio de último lanzamiento para más información detallada sobre esta versión.

Jekyll 4.0

El generador de página estática Jekyll y su complementos han sido actualizado a la versión 4.0.0. Esta versión incluye los cambios siguientes compararon a versión 3.8:

  • Mejoras de rendimiento significativa

  • Purgado y reparaciones de fallos

  • Otros cambios menores incompatibles con la versión anterior

Para más información sobre Jekyll 4.0.0, consulte https://jekyllrb.com/news/2019/08/20/jekyll-4-0-0-released/.