每年圣诞节 Ruby核心团队发布 新版本的Ruby。 今年 这是一个很大的- Ruby 3.0刚刚发布! 这次的主要新函数是 支持静态分析 以及新的并发函数。 

Ruby和类型

RBS 是新的语言 用于描述Ruby程序中的类型。 类型检查器,如 SorbetSteep 或新推出的 TypeProf 可以使用这些类型 静态分析程序。 这是一个来自RBS文档的简单示例:

# Actual code
class User
  attr_reader :login, :email

  def initialize(login:, email:)
    @login, @email = login, email
  end
end

# RBS
class User
  attr_reader login: String
  attr_reader email: String

  def initialize: (login: String, email: String) -> void
end

一种新的静态类型分析器,称为 TypeProf 现在包含在Ruby中。 为了说明一个非常简单的例子, 考虑以下代码:

def foo
  'bar'
end

foo(12)

运行 typeprof -v foo.rb 将产生以下输出

# Errors
test.rb:5: [error] wrong number of arguments (given 1, expected 0)

# Classes
class Object
  private
  def foo: -> String
end

Ractors

Ruby的全局解释器锁(GVL) 已经停止了Ruby的 能够并行使用多个内核。 要解决此问题, 引入了一个新的类似于actor的并发原语, 称为 Ractor

这是文档中的一个简单示例, 显示消息传递如何与拖拉机配合使用。 您可以在 Ractor文档

r1, r2 = *(1..2).map do
  Ractor.new do
    n = Ractor.recv
    n.prime?
  end
end

r1.send 2**61 - 1
r2.send 2**61 + 15

p r1.take #=> true
p r2.take #=> true

向右分配

实验支持增加了向右分配。您可以使用 => 在右侧分配一个变量,但是我不认为在简单分配上使用此变量的原因。但是,这对于数组和哈希中的模式匹配值很有用。

42 => x # same as x = 42

x = { a: 1, b: 2 }

x => { b: foo }
foo #=> 2

查找模式匹配

模式匹配语法已扩展 允许从数组中提取元素。 这是一个简单的示例:

case ['a', 1, 'b', 'c', 2, 'd', 'e', 'f', 3]
in [*pre, String => x, String => y, *post]
  pre  #=> ["a", 1]
  x    #=> "b"
  y    #=> "c"
  post #=> [2, "d", "e", "f", 3]
end

Endless方法定义

添加了新语法 使您可以跳过end 当方法体 包含一个表达式。 当您需要提取时 代码中的单行方法 这种简洁的语法会派上用场。

def square(x) = x * x

参数传递

Ruby 2.7引入了参数转发 使用 ... 语法。 但是,您可能需要访问主要参数 并转发其余的。 现在,语法已更新为允许此操作:

def method_missing(method_name, ...)
  return nil unless method_name.in?(allowed_methods)

  object.send(method_name, ...)
end

Hash

Hash#transform_keys 已更新为接受一个参数,该参数使您可以定义应重命名的键。您还可以传递一个块,该块将用于转换其余键。

note = { title: 'Ruby 3.0', created_at: '2020-12-25' }

# without block
note.transform_keys({ created_at: :created })
# => { title: 'Ruby 3.0', created: '2020-12-25' }

# with block
note.transform_keys({ created_at: 'created' }, &:to_s)
# => { 'title' => 'Ruby 3.0', 'created' => '2020-12-25' }

Hash#except 该语言本身已包含通过ActiveSupport在Rails中可用的语言。

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

性能目标,又名Ruby 3x3

2015年,Matz宣布 Ruby 3的速度将是3倍 与Ruby 2.0相比 (又称3x3目标)。 optcarrot基准测试。 早已使用 比较不同版本的Ruby, 并启用了JIT, 3.0确实达到了3倍的目标。

MJIT还不成熟, 并非所有程序 可以利用加速。 例如,Rails应用程序 实际表现较差 启用JIT。 但是,这仍然是个好消息 用于CPU绑定的程序。 借助新引入的并发函数, 此版本最大的性能优势 稍后会看到 随着越来越多的类库利用这些函数。


有关我以前的Ruby版本的帖子,请参见此处: 2.7 2.6 2.5 2.4 2.3

这一章你学到了什么?来做个笔记,好记忆不如烂笔头! 如果觉得对您有帮助,麻烦帮分享给您的朋友😊😊

祝学习愉快!(如果觉得不正确,选中要修改的内容->右键->编辑)

点我分享笔记