Fuente de la imagen
Buenas noticias para los desarrolladores: ha llegado Ruby 3.0.0, una nueva versión de un lenguaje de programación dinámico orientado a objetos. Según sus fans, la nueva versión incluye lo mejor de Perl, Java, Python, Smalltalk, Eiffel, Ada y Lisp.
La nueva versión de Ruby es la octava versión principal y ha recibido muchas actualizaciones y mejoras. Por cierto, los desarrolladores han estado trabajando en la tercera versión durante unos cinco años. Sus características son alto rendimiento, simultaneidad y mecanografía.
Por cierto, lo mismo hace cinco años, el autor del lenguaje Yukihiro Matsumoto propuso el concepto Ruby 3x3. Implica que el lanzamiento de Ruby 3.0 será posible después de que pueda lograr tres veces la mejora de rendimiento con respecto a la versión 2.0. En la última versión, esto se ha logrado mediante un soporte mejorado de compilación JIT.
¿Qué hay de nuevo?
- RBS, Ruby. RBS . : , , , . , TypeProf, , RBS.
module ChatApp
VERSION: String
class Channel
attr_reader name: String
attr_reader messages: Array[Message]
attr_reader users: Array[User | Bot] # `|` means union types, `User` or `Bot`.
def initialize: (String) -> void
def post: (String, from: User | Bot) -> Message # Method overloading is supported.
| (File, from: User | Bot) -> Message
end
end
- Ractor. , . , , . .
require 'prime'
# n.prime? with sent integers in r1, r2 run in parallel
r1, r2 = *(1..2).map do
Ractor.new do
n = Ractor.recv
n.prime?
end
end
# send parameters
r1.send 2**61 - 1
r2.send 2**61 + 15
# wait for the results of expr1, expr2
p r1.take #=> true
p r2.take #=> true
- fiber- Fiber#scheduler, , . , :
- Bloqueo # Mutex, # Desbloqueo # Mutex, # suspensión
- ConditionVariable # espera
- Cola # pop, SizedQueue # push
- Thread # join
- Kernel # sleep
- Process.wait
- IO # wait, IO # read, IO # write y relacionados con ellos métodos
require 'async'
require 'net/http'
require 'uri'
Async do
["ruby", "python", "c"].each do |topic|
Async do
Net::HTTP.get(URI "https://www.google.com/search?q=#{topic}")
end
end
end
- Se ha rediseñado el patrón unifilar que coincide "Agregar operador - variable de valor", que se utiliza para la asignación de valores a la derecha.
0 => a
p a #=> 0
{b: 0, c: 1} => {b:}
p b #=> 0
Además, se ha cambiado el comportamiento de "in", ahora devuelve verdadero o falso.
# version 3.0
0 in 1 #=> false
# version 2.7
0 in 1 #=> raise NoMatchingPatternError
Plantilla experimental agregada para encontrar valores:
case ["a", 1, "b", "c", 2, "d", "e", "f", 3]
in [*pre, String => x, String => y, *post]
p pre #=> ["a", 1]
p x #=> "b"
p y #=> "c"
p post #=> [2, "d", "e", "f", 3]
end
- Se agregó Hash # excepto el método.
h = { a: 1, b: 2, c: 3 }
p h.except(:a) #=> {:b=>2, :c=>3}
- Ahora hay soporte para definiciones de métodos de una línea sin usar la palabra clave "end".
def square(x) = x * x
- C-API - .
- IRB. , 53 (!) , Ruby 2.7.
- gem-, stdlib.