Foi lançada a linguagem de programação Ruby 3.0.0, que vem sendo preparada desde 2015



Imagem fonte



Boa notícia para desenvolvedores - o Ruby 3.0.0 chegou, uma nova versão de uma linguagem de programação orientada a objeto dinâmico. Segundo seus fãs, a nova versão traz o melhor de Perl, Java, Python, Smalltalk, Eiffel, Ada e Lisp.



A nova versão do Ruby é o oitavo grande lançamento e recebeu muitas atualizações e melhorias. A propósito, os desenvolvedores estão trabalhando na terceira versão há cerca de cinco anos. Suas características são alto desempenho, simultaneidade e digitação.



Aliás, o mesmo há cinco anos, o autor da linguagem Yukihiro Matsumoto propôs o conceito Ruby 3x3. Isso implica que o lançamento do Ruby 3.0 será possível após atingir três vezes a melhoria de desempenho em relação à versão 2.0. Na versão mais recente, isso foi alcançado por meio do suporte aprimorado à compilação JIT.



O que há de novo?



  • 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 # esperar, IO # ler, IO # gravar e relacionados com eles 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
      
      





  • As linhas de correspondência de padrão "Adicionar operador - valor variável", que é usado para atribuição de valores à direita, foram retrabalhadas.


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





Além disso, o comportamento de "em" foi alterado, agora retorna verdadeiro ou falso.

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





Adicionado modelo experimental 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
      
      





  • Adicionado Hash # exceto método.


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





  • Agora há suporte para uma definição de método de uma linha sem usar a palavra-chave "fim".


   def square(x) = x * x
      
      





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





All Articles