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