Ruby 3.0 新特征介绍
每年圣诞节 Ruby核心团队发布 新版本的Ruby。 今年 这是一个很大的- Ruby 3.0刚刚发布! 这次的主要新函数是 支持静态分析 以及新的并发函数。
Ruby和类型
RBS 是新的语言 用于描述Ruby程序中的类型。 类型检查器,如 Sorbet, Steep 或新推出的 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 。
链接:https://www.learnfk.com/article-ruby-3-0-features
来源:Learnfk无涯私塾网