Le langage de programmation Ruby 3.0.0 a été publié, qui a été préparé depuis 2015



Source de l' image



Bonne nouvelle pour les développeurs -Ruby 3.0.0est sorti, une nouvelle version d'un langage de programmation dynamique orienté objet. Selon ses fans, la nouvelle version comprend le meilleur de Perl, Java, Python, Smalltalk, Eiffel, Ada et Lisp.



La nouvelle version de Ruby est la huitième version majeure et a reçu de nombreuses mises à jour et améliorations. Au fait, les développeurs travaillent sur la troisième version depuis environ cinq ans. Ses fonctionnalités sont hautes performances, simultanéité et saisie.



D'ailleurs, il y a cinq ans, l'auteur du langage Yukihiro Matsumoto a proposé le concept Ruby 3x3. Cela implique que la sortie de Ruby 3.0 deviendra possible après trois fois l'amélioration des performances par rapport à la version 2.0. Dans la dernière version, cela a été réalisé grâce à une meilleure prise en charge de la compilation JIT.



Quoi de neuf?



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


- Mutex # lock, Mutex # unlock, Mutex # sleep

- ConditionVariable # wait

- Queue # pop, SizedQueue # push

- Thread # join

- Kernel # sleep

- Process.wait

- IO # wait, IO # read, IO # write and related avec eux méthodes



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
      
      





  • Les one-liners du pattern matching "Add operator - variable-value", qui est utilisé pour l'affectation des valeurs à droite, ont été retravaillés.


   0 => a
   p a #=> 0
   {b: 0, c: 1} => {b:}
   p b #=> 0
      
      





De plus, le comportement de "in" a changé, il renvoie maintenant vrai ou faux.

   # version 3.0
   0 in 1 #=> false
   # version 2.7
   0 in 1 #=> raise NoMatchingPatternError
      
      





Ajout d'un modèle expérimental pour trouver des valeurs:


   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
      
      





  • Ajout de Hash # sauf la méthode.


   h = { a: 1, b: 2, c: 3 }
   p h.except(:a) #=> {:b=>2, :c=>3}
      
      





  • Il existe désormais un support pour les définitions de méthode sur une ligne sans utiliser le mot clé "end".


   def square(x) = x * x
      
      





  • C-API - .
  • IRB. , 53 (!) , Ruby 2.7.
  • gem-, stdlib.





All Articles