由 naruse 发布于 2020 年 9 月 25 日
我们很高兴地宣布 Ruby 3.0.0-preview1 的发布。
它引入了许多新特性和性能改进。
RBS
RBS 是一种描述 Ruby 程序类型的语言。包括 type-profiler 在内的类型检查器和其他支持 RBS 的工具,将能够更好地理解带有 RBS 定义的 Ruby 程序。
您可以写下类和模块的定义:类中定义的方法、实例变量及其类型,以及继承/混入关系。RBS 的目标是支持 Ruby 程序中常见的模式,并且允许编写高级类型,包括联合类型、方法重载和泛型。它还通过接口类型支持鸭子类型。
Ruby 3.0 附带 rbs
gem,它允许解析和处理用 RBS 编写的类型定义。
以下是一个小的 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
有关更多详细信息,请参阅 rbs gem 的 README。
Ractor (实验性)
Ractor 是一种类似 Actor 模型的并发抽象,旨在提供并行执行功能,而无需担心线程安全问题。
您可以创建多个 Ractor 并行运行它们。Ractor 能够创建线程安全的并行程序,因为 Ractor 不能共享普通对象。Ractor 之间的通信通过消息传递来支持。
为了限制对象共享,Ractor 对 Ruby 的语法引入了一些限制(如果没有多个 Ractor,则没有变化)。
规范和实现尚未成熟,未来可能会发生变化,因此此功能被标记为实验性,并在创建 Ractor 时显示实验性功能警告。
以下小程序使用两个 Ractor 并行计算 prime?
,并且在两个或更多内核上的速度大约比顺序程序快 2 倍。
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
有关更多详细信息,请参阅 doc/ractor.md。
调度器 (实验性)
引入了 Thread#scheduler
用于拦截阻塞操作。这允许在不更改现有代码的情况下实现轻量级并发。
目前支持的类/方法
Mutex#lock
,Mutex#unlock
,Mutex#sleep
ConditionVariable#wait
Queue#pop
,SizedQueue#push
Thread#join
Kernel#sleep
IO#wait
,IO#read
,IO#write
和相关方法 (例如#wait_readable
,#gets
,#puts
等)。IO#select
不支持。
当前的并发入口点是 Fiber.schedule{...}
,但这在 Ruby 3 发布时可能会发生变化。
目前,Async::Scheduler
中有一个测试调度器可用。有关更多详细信息,请参阅 doc/scheduler.md
。 [Feature #16786]
注意:此功能是高度实验性的。名称和功能都将在下一个预览版本中更改。
其他值得关注的新特性
-
添加了右向赋值语句。
fib(10) => x p x #=> 55
-
添加了无尽方法定义。
def square(x) = x * x
-
添加了查找模式。
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
-
Hash#except
现在是内置的。h = { a: 1, b: 2, c: 3 } p h.except(:a) #=> {:b=>2, :c=>3}
-
内存视图作为实验性功能添加
- 这是一组新的 C-API,用于在扩展库之间交换原始内存区域,例如数字数组和位图图像。扩展库还可以共享内存区域的元数据,包括形状、元素格式等。使用这些类型的元数据,扩展库甚至可以适当地共享多维数组。此功能的设计参考了 Python 的缓冲区协议。
性能改进
- MJIT 中实现了许多改进。请参阅 NEWS 了解详细信息。
自 2.7 以来的其他值得关注的更改
- 关键字参数与其他参数分离。
- 原则上,在 Ruby 2.7 上打印警告的代码将无法工作。有关详细信息,请参阅文档。
-
顺便说一句,参数转发现在支持前导参数。
def method_missing(meth, ...) send(:"do_#{ meth }", ...) end
-
$SAFE
的功能已完全删除;现在它是一个普通的全局变量。 -
回溯的顺序在 Ruby 2.5 中被反转,但它被取消了。现在它的行为类似于 Ruby 2.4;首先打印错误消息和发生异常的行号,然后打印其调用者。
- 一些标准库已更新。
- RubyGems 3.2.0.rc.1
- Bundler 2.2.0.rc.1
- IRB 1.2.6
- Reline 0.1.5
- 以下库不再是捆绑的 gem。安装相应的 gem 以使用这些功能。
- net-telnet
- xmlrpc
- 将默认 gem 提升为捆绑的 gem。
- rexml
- rss
- 将 stdlib 提升为默认 gem。以下默认 gem 已在 rubygems.org 上发布
- abbrev
- base64
- English
- erb
- find
- io-nonblock
- io-wait
- net-ftp
- net-http
- net-imap
- net-protocol
- nkf
- open-uri
- optparse
- resolv
- resolv-replace
- rinda
- securerandom
- set
- shellwords
- tempfile
- time
- tmpdir
- tsort
- weakref
通过这些更改,自 Ruby 2.7.0 以来,更改了 3385 个文件,插入了 150159 个(+),删除了 124949 个(-)!
请尝试 Ruby 3.0.0-preview1,并给我们任何反馈!
下载
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.bz2
SIZE: 15538340 SHA1: 032697f3ace0a697cd72f68bac0032c31a8328d4 SHA256: 013bdc6e859d76d67a6fcd990d401ed57e6e25896bab96d1d0648a877f556dbb SHA512: 3a6a6458d9c5f06555ab8705160f6b071f4dbe9d2a91cd7848852633657b495c480d74e4b2ff2cebddda556118d26bbb271160c989bc970bb1b5cb234e868d2f
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.gz
SIZE: 17747808 SHA1: 2842d2af2568d74c8d4071f5f536889a6b149202 SHA256: ce8bd7534e7ec2a870b24d2145ea20e9bbe5b2d76b7dfa1102dbee5785253105 SHA512: b94892951f842a1538f4b99022606ac2c0b5031f1ede7eef3833a8caa9ed63e9b22868509173bfefb406f263c65211db75597b152b61f49e5ba2a875fce63a27
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.tar.xz
SIZE: 12703060 SHA1: 91d9fbe87504924148deeec90199d6ff4d7dcf56 SHA256: aa7cce0c99f4ea2145fef9b78d74a44857754396790cd23bad75d759811e7a2a SHA512: dca5dcc965c434371947c100864090e29e649e19ae24b8bb2e88a534ebd8220c5a086035a999b1e8b1cd5ec154a6985a8d8dfea56095d712d62aeea7a2054f7d
-
https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview1.zip
SIZE: 22002645 SHA1: 4b5b61066373daf0a947d3fafe2645788504a164 SHA256: a39a48ed9a8ca2c83d65d225a1bb3db331c6587a77ba156c20e630c1b4bfc23b SHA512: 10f6f28715a52093d7d9da82d1678147091b45e2f279e463626adea8efbf181485daa42565e5086057ffb45a097ffb8ff395c572b247b6b5da27d85933cf58a8
3.0.0-preview2 预告
我们计划包含 “type-profiler”,这是一个静态类型分析功能。敬请期待!
什么是 Ruby
Ruby 最初由 Matz (Yukihiro Matsumoto) 于 1993 年开发,现在作为开源项目进行开发。它在多个平台上运行,并在全球范围内使用,尤其是在 Web 开发中。