|
| 1 | +--- |
| 2 | +layout: news_post |
| 3 | +title: "Publicado Ruby 4.0.0 preview3" |
| 4 | +author: "naruse" |
| 5 | +translator: vtamara |
| 6 | +date: 2025-12-18 00:00:00 +0000 |
| 7 | +lang: es |
| 8 | +--- |
| 9 | + |
| 10 | +{% assign release = site.data.releases | where: "version", "4.0.0-preview3" | first %} |
| 11 | +Nos complace anunciar la publicación de Ruby {{ release.version }}. |
| 12 | +Ruby 4.0 introduce Ruby::BOX y "ZJIT", y agrega muchas mejoras. |
| 13 | + |
| 14 | +## Ruby::BOX |
| 15 | + |
| 16 | +Una nueva característica (experimental) para dar separación en definiciones. |
| 17 | +Vea detalles de "Ruby Box" en [doc/language/box.md](https://github.com/ruby/ruby/blob/master/doc/language/box.md). |
| 18 | +[[Característica #21311]] [[Misc #21385]] |
| 19 | + |
| 20 | +## Cambios en el lenguaje |
| 21 | + |
| 22 | +* `*nil` ya no llama a `nil.to_a`, de forma similar a como `**nil` |
| 23 | + no llama a `nil.to_hash`. [[Característica #21047]] |
| 24 | + |
| 25 | +* Los operadores binarios lógicos (`||`, `&&`, `and` and `or`) al comienzo |
| 26 | + de una línea continúan la línea anterior, cómo un punto fluido. |
| 27 | + Los siguientes dos códigos son iguales: |
| 28 | + |
| 29 | + ```ruby |
| 30 | + if condicion1 |
| 31 | + && condicion2 |
| 32 | + ... |
| 33 | + end |
| 34 | + ``` |
| 35 | + |
| 36 | + ```ruby |
| 37 | + if condicion1 && condicion2 |
| 38 | + ... |
| 39 | + end |
| 40 | + ``` |
| 41 | + |
| 42 | + [[Característica #20925]] |
| 43 | + |
| 44 | +## Actualizaciones a las clases principales |
| 45 | + |
| 46 | +Nota: Sólo listamos actualizaciones mayores a clases. |
| 47 | + |
| 48 | +* Kernel |
| 49 | + |
| 50 | +* `Kernel#inspect` ahora comprueba la existencia del método `#instance_variables_to_inspect`, |
| 51 | +lo que permite controlar qué variables de instancia se muestran en la cadena `#inspect`: |
| 52 | + |
| 53 | +```ruby |
| 54 | +class DatabaseConfig |
| 55 | +def initialize(host, user, password) |
| 56 | +@host = host |
| 57 | +@user = user |
| 58 | +@password = password |
| 59 | +end |
| 60 | +
|
| 61 | +private def instance_variables_to_inspect = [:@host, :@user] |
| 62 | +end |
| 63 | +
|
| 64 | +conf = DatabaseConfig.new("localhost", "root", "hunter2") |
| 65 | +conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"> |
| 66 | +``` |
| 67 | + |
| 68 | +[[Característica #21219]] |
| 69 | + |
| 70 | +* Se eliminó un comportamiento obsoleto: la creación de procesos mediante `Kernel#open` con un |
| 71 | +`|` inicial. [[Característica #19630]] |
| 72 | + |
| 73 | +* Binding |
| 74 | + |
| 75 | +* `Binding#local_variables` ya no incluye parámetros numerados. |
| 76 | +Además, `Binding#local_variable_get` y `Binding#local_variable_set` rechazan |
| 77 | +manejar parámetros numerados. [[Error #21049]] |
| 78 | + |
| 79 | +* File |
| 80 | + |
| 81 | +* `File::Stat#birthtime` ahora está disponible en Linux a través de la llamada al sistema statx |
| 82 | +cuando el kernel y el sistema de archivos lo admiten. |
| 83 | +[[Característica #21205]] |
| 84 | + |
| 85 | +* IO |
| 86 | + |
| 87 | +* `IO.select` acepta `Float::INFINITY` como argumento de tiempo de espera. |
| 88 | +[[Característica #20610]] |
| 89 | + |
| 90 | +* Se eliminó un comportamiento obsoleto: la creación de procesos mediante métodos de clase `IO` |
| 91 | +con un `|` inicial. [[Característica #19630]] |
| 92 | + |
| 93 | +* Math |
| 94 | + |
| 95 | +* Se agregaron `Math.log1p` y `Math.expm1`. [[Característica #21527]] |
| 96 | + |
| 97 | +* Method |
| 98 | + |
| 99 | +* `Method#source_location`, `Proc#source_location` y |
| 100 | +`UnboundMethod#source_location` ahora devuelven información de ubicación extendida |
| 101 | +con 5 elementos: `[ruta, línea_inicio, columna_inicio, |
| 102 | +línea_fin, columna_fin]`. El formato anterior de dos elementos `[ruta, |
| 103 | +línea]` aún se puede obtener llamando a `.take(2)` sobre el resultado. |
| 104 | +[[Característica #6012]] |
| 105 | + |
| 106 | +* Proc |
| 107 | + |
| 108 | +* `Proc#parameters` ahora muestra los parámetros opcionales anónimos como `[:opt]` |
| 109 | +en lugar de `[:opt, nil]`, lo que hace que la salida sea coherente con el caso en que el |
| 110 | +parámetro anónimo es obligatorio. [[Error #20974]] |
| 111 | + |
| 112 | +* Ractor |
| 113 | + |
| 114 | +* Se agregó la clase `Ractor::Port` para un nuevo mecanismo de sincronización |
| 115 | +para la comunicación entre Ractors. [[Característica #21262]] |
| 116 | + |
| 117 | +```ruby |
| 118 | +port1 = Ractor::Port.new |
| 119 | +port2 = Ractor::Port.new |
| 120 | +Ractor.new port1, port2 do |port1, port2| |
| 121 | +port1 << 1 |
| 122 | +port2 << 11 |
| 123 | +port1 << 2 |
| 124 | +port2 << 12 |
| 125 | +end |
| 126 | +2.times{ p port1.receive } #=> 1, 2 |
| 127 | +2.times{ p port2.receive } #=> 11, 12 |
| 128 | +``` |
| 129 | + |
| 130 | +`Ractor::Port` proporciona los siguientes métodos: |
| 131 | + |
| 132 | +* `Ractor::Port#receive` |
| 133 | +* `Ractor::Port#send` (o `Ractor::Port#<<`) |
| 134 | +* `Ractor::Port#close` |
| 135 | +* `Ractor::Port#closed?` |
| 136 | + |
| 137 | +Como resultado, se eliminaron `Ractor.yield` y `Ractor#take`. |
| 138 | + |
| 139 | +* Se agregaron `Ractor#join` y `Ractor#value` para esperar la |
| 140 | +finalización de un Ractor. Estos son similares a `Thread#join` |
| 141 | +y `Thread#value`. |
| 142 | + |
| 143 | +* Se agregaron `Ractor#monitor` y `Ractor#unmonitor` como interfaces de bajo nivel |
| 144 | +utilizadas internamente para implementar `Ractor#join`. |
| 145 | + |
| 146 | +* `Ractor.select` ahora solo acepta Ractors y Ports. Si se proporcionan Ractors, |
| 147 | +devuelve un valor cuando un Ractor finaliza. |
| 148 | + |
| 149 | +* Se agregó `Ractor#default_port`. Cada `Ractor` tiene un puerto predeterminado, |
| 150 | +que es utilizado por `Ractor.send` y `Ractor.receive`. * Se eliminaron `Ractor#close_incoming` y `Ractor#close_outgoing`. |
| 151 | + |
| 152 | +* Se introdujeron `Ractor.shareable_proc` y `Ractor.shareable_lambda` |
| 153 | +para crear objetos Proc o lambda compartibles. |
| 154 | +[[Característica #21550]], [[Característica #21557]] |
| 155 | + |
| 156 | +* Range |
| 157 | + |
| 158 | +* `Range#to_set` y `Enumerator#to_set` ahora realizan comprobaciones de tamaño para evitar |
| 159 | +problemas con rangos infinitos. [[Falla #21654]] |
| 160 | + |
| 161 | +* `Range#overlap?` ahora maneja correctamente los rangos infinitos (sin límites). |
| 162 | +[[Falla #21185]] |
| 163 | + |
| 164 | +* Se corrigió el comportamiento de `Range#max` en rangos de enteros sin límite inferior. |
| 165 | +[[Falla #21174]] [[Falla #21175]] |
| 166 | + |
| 167 | +* Ruby |
| 168 | + |
| 169 | +* Se ha definido un nuevo módulo de nivel superior `Ruby`, que contiene |
| 170 | +constantes relacionadas con Ruby. Este módulo estaba reservado en Ruby 3.4 |
| 171 | +y ahora está definido oficialmente. [[Característica #20884]] |
| 172 | + |
| 173 | +* Ruby::Box |
| 174 | + |
| 175 | +* Una nueva característica (experimental) para proporcionar separación entre definiciones. |
| 176 | +Para obtener detalles sobre "Ruby Box", consulte [doc/language/box.md](https://github.com/ruby/ruby/blob/master/doc/language/box.md). |
| 177 | +[[Característica #21311]] [[Misc #21385]] |
| 178 | + |
| 179 | +* Set |
| 180 | + |
| 181 | +* `Set` ahora es una clase principal, en lugar de una clase de la biblioteca estándar de carga automática. |
| 182 | +[[Característica #21216]] |
| 183 | + |
| 184 | +* `Set#inspect` ahora devuelve una cadena adecuada para `eval`, utilizando la |
| 185 | +sintaxis `Set[]` (por ejemplo, `Set[1, 2, 3]` en lugar de |
| 186 | +`#<Set: {1, 2, 3}>`). Esto lo hace coherente con otras clases de colecciones principales |
| 187 | +como Array y Hash. [[Característica #21389]] |
| 188 | + |
| 189 | +* Pasar argumentos a `Set#to_set` y `Enumerable#to_set` ahora está obsoleto. |
| 190 | +[[Característica #21390]] |
| 191 | + |
| 192 | +* Socket |
| 193 | + |
| 194 | +## JIT |
| 195 | + |
| 196 | +* ZJIT |
| 197 | + * Se agregó un compilador JIT experimental basado en métodos. |
| 198 | + Use `--enable-zjit` en `configure` para habilitar el soporte `--zjit`. |
| 199 | + * A partir de Ruby 4.0.0-preview2, ZJIT aún no está listo para acelerar |
| 200 | + la mayoría de los benchmarks. |
| 201 | + Por favor, absténgase de evaluar ZJIT por el momento. Manténgase |
| 202 | + atento al lanzamiento de Ruby 4.0. |
| 203 | + |
| 204 | +* YJIT |
| 205 | + * Estadísticas de YJIT |
| 206 | + * `ratio_in_yjit` ya no funciona en la compilación predeterminada. |
| 207 | + Use `--enable-yjit=stats` en `configure` para habilitarlo |
| 208 | + con `--yjit-stats`. |
| 209 | + * Se agregó `invalidate_everything` a las estadísticas |
| 210 | + predeterminadas, que se incrementa cuando TracePoint invalida |
| 211 | + todo el código. |
| 212 | + * Se agregaron las opciones `mem_size:` y `call_threshold:` a |
| 213 | + `RubyVM::YJIT.enable`. |
| 214 | +* RJIT |
| 215 | + * Se eliminó `--rjit`. Trasladaremos la implementación de la API JIT de |
| 216 | + terceros al repositorio [ruby/rjit](https://github.com/ruby/rjit). |
| 217 | + |
| 218 | + |
| 219 | +* ZJIT |
| 220 | + * Se introduce un [compilador JIT experimental basado en métodos](https://docs.ruby-lang.org/en/master/jit/zjit_md.html). |
| 221 | + Para habilitar soporte `--zjit`, compile Ruby con Rust 1.85.0 o |
| 222 | + posterior. |
| 223 | + * En Ruby 4.0.0, ZJIT es tan rápido como el interprete, pero aún no |
| 224 | + tan rápido como YJIT. |
| 225 | + Animamos a experimentar con ZJIT, pero advertimos no desplegarlo |
| 226 | + en producción por ahora. |
| 227 | + * Nuestra meta es hacer ZJIT más rápido que YJIT y listo para |
| 228 | + producción en Ruby 4.1. |
| 229 | +* YJIT |
| 230 | + * `RubyVM::YJIT.runtime_stats` |
| 231 | + * `ratio_in_yjit` ya no funciona en la compilación predeterminada. |
| 232 | + Use `--enable-yjit=stats` en `configure` para habilitarlo |
| 233 | + con `--yjit-stats`. |
| 234 | + * Se agregó `invalidate_everything` a las estadísticas |
| 235 | + predeterminadas, que se incrementa cuando TracePoint invalida |
| 236 | + todo el código. |
| 237 | + * Se agregaron las opciones `mem_size:` y `call_threshold:` a |
| 238 | + `RubyVM::YJIT.enable`. |
| 239 | +* RJIT |
| 240 | + * Se eliminó `--rjit`. Trasladaremos la implementación de la API JIT de |
| 241 | + terceros al repositorio [ruby/rjit](https://github.com/ruby/rjit). |
| 242 | + |
| 243 | + |
| 244 | +## Cambios varios |
| 245 | + |
| 246 | +Consulte [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) |
| 247 | +o le[registro de commits](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}) para obtener más detalles. |
| 248 | + |
| 249 | +Con estos cambios, ¡[{{ release.stats.files_changed }} archivos modificados, {{ release.stats.insertions }} inserciones (+), {{ release.stats.deletions }} eliminaciones (-)](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}#file_bucket) |
| 250 | +desde Ruby 3.4.0! |
| 251 | + |
| 252 | + |
| 253 | +## Descargas |
| 254 | + |
| 255 | +* <{{ release.url.gz }}> |
| 256 | + |
| 257 | + SIZE: {{ release.size.gz }} |
| 258 | + SHA1: {{ release.sha1.gz }} |
| 259 | + SHA256: {{ release.sha256.gz }} |
| 260 | + SHA512: {{ release.sha512.gz }} |
| 261 | + |
| 262 | +* <{{ release.url.xz }}> |
| 263 | + |
| 264 | + SIZE: {{ release.size.xz }} |
| 265 | + SHA1: {{ release.sha1.xz }} |
| 266 | + SHA256: {{ release.sha256.xz }} |
| 267 | + SHA512: {{ release.sha512.xz }} |
| 268 | + |
| 269 | +* <{{ release.url.zip }}> |
| 270 | + |
| 271 | + SIZE: {{ release.size.zip }} |
| 272 | + SHA1: {{ release.sha1.zip }} |
| 273 | + SHA256: {{ release.sha256.zip }} |
| 274 | + SHA512: {{ release.sha512.zip }} |
| 275 | + |
| 276 | +## What is Ruby |
| 277 | + |
| 278 | +Ruby fue desarrollado por primera vez por Matz (Yukihiro Matsumoto) en 1993, |
| 279 | +y actualmente se desarrolla como software de código abierto. Se ejecuta en |
| 280 | +múltiples plataformas y se utiliza en todo el mundo, especialmente para el |
| 281 | +desarrollo web. |
| 282 | + |
| 283 | +[Característica #6012]: https://bugs.ruby-lang.org/issues/6012 |
| 284 | +[Característica #15408]: https://bugs.ruby-lang.org/issues/15408 |
| 285 | +[Característica #17473]: https://bugs.ruby-lang.org/issues/17473 |
| 286 | +[Característica #18455]: https://bugs.ruby-lang.org/issues/18455 |
| 287 | +[Característica #19630]: https://bugs.ruby-lang.org/issues/19630 |
| 288 | +[Falla #19868]: https://bugs.ruby-lang.org/issues/19868 |
| 289 | +[Característica #19908]: https://bugs.ruby-lang.org/issues/19908 |
| 290 | +[Característica #20610]: https://bugs.ruby-lang.org/issues/20610 |
| 291 | +[Característica #20724]: https://bugs.ruby-lang.org/issues/20724 |
| 292 | +[Característica #20750]: https://bugs.ruby-lang.org/issues/20750 |
| 293 | +[Característica #20884]: https://bugs.ruby-lang.org/issues/20884 |
| 294 | +[Característica #20925]: https://bugs.ruby-lang.org/issues/20925 |
| 295 | +[Característica #20971]: https://bugs.ruby-lang.org/issues/20971 |
| 296 | +[Falla #20974]: https://bugs.ruby-lang.org/issues/20974 |
| 297 | +[Característica #21047]: https://bugs.ruby-lang.org/issues/21047 |
| 298 | +[Falla #21049]: https://bugs.ruby-lang.org/issues/21049 |
| 299 | +[Característica #21166]: https://bugs.ruby-lang.org/issues/21166 |
| 300 | +[Falla #21174]: https://bugs.ruby-lang.org/issues/21174 |
| 301 | +[Falla #21175]: https://bugs.ruby-lang.org/issues/21175 |
| 302 | +[Falla #21185]: https://bugs.ruby-lang.org/issues/21185 |
| 303 | +[Característica #21205]: https://bugs.ruby-lang.org/issues/21205 |
| 304 | +[Característica #21216]: https://bugs.ruby-lang.org/issues/21216 |
| 305 | +[Característica #21219]: https://bugs.ruby-lang.org/issues/21219 |
| 306 | +[Característica #21258]: https://bugs.ruby-lang.org/issues/21258 |
| 307 | +[Característica #21262]: https://bugs.ruby-lang.org/issues/21262 |
| 308 | +[Característica #21275]: https://bugs.ruby-lang.org/issues/21275 |
| 309 | +[Característica #21287]: https://bugs.ruby-lang.org/issues/21287 |
| 310 | +[Característica #21311]: https://bugs.ruby-lang.org/issues/21311 |
| 311 | +[Característica #21347]: https://bugs.ruby-lang.org/issues/21347 |
| 312 | +[Característica #21360]: https://bugs.ruby-lang.org/issues/21360 |
| 313 | +[Misc #21385]: https://bugs.ruby-lang.org/issues/21385 |
| 314 | +[Característica #21389]: https://bugs.ruby-lang.org/issues/21389 |
| 315 | +[Característica #21390]: https://bugs.ruby-lang.org/issues/21390 |
| 316 | +[Característica #21459]: https://bugs.ruby-lang.org/issues/21459 |
| 317 | +[Característica #21527]: https://bugs.ruby-lang.org/issues/21527 |
| 318 | +[Característica #21550]: https://bugs.ruby-lang.org/issues/21550 |
| 319 | +[Característica #21557]: https://bugs.ruby-lang.org/issues/21557 |
| 320 | +[Falla #21654]: https://bugs.ruby-lang.org/issues/21654 |
0 commit comments