Se lanza el lenguaje de programación Ruby 3.0.0, que se prepara desde 2015



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?



  • MJIT. , , ( Optcarrot), AI ( Rubykon). , . , , . JIT-, , , , Rails. , i-cache.




  • 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.





All Articles