Ruby 3.0.0 Preview 1 发布

naruse 发布于 2020 年 9 月 25 日

我们很高兴地宣布 Ruby 3.0.0-preview1 的发布。

它引入了许多新功能和性能改进。

RBS

RBS 是一个用于描述 Ruby 程序类型的语言。带有 RBS 定义的类型检查器,包括 type-profiler 和其他支持 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#waitIO#readIO#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
  • 将标准库提升为默认 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

有关更多详细信息,请参阅 NEWS提交日志

通过这些更改,自 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 开发领域。

近期新闻

Ruby 4.0.0 发布

我们很高兴地宣布 Ruby 4.0.0 的发布。Ruby 4.0 引入了“Ruby Box”和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 25 日

Ruby 文档的全新外观

继 ruby-lang.org 重新设计之后,我们还有更多好消息来庆祝 Ruby 成立 30 周年:docs.ruby-lang.org 采用了 Aliki——RDoc 的新默认主题,焕然一新。

Stan Lo 发布于 2025 年 12 月 23 日

重新设计我们的网站标识

我们很高兴地宣布对我们的网站进行全面重新设计。此次更新的设计由 Akatsuka Taeko 创作。

Hiroshi SHIBATA 发布于 2025 年 12 月 22 日

Ruby 4.0.0 preview3 发布

我们很高兴地宣布 Ruby 4.0.0-preview3 的发布。Ruby 4.0 引入了 Ruby::Box 和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 18 日

更多新闻...