Ruby 3.0.0 Preview 2 发布

naruse 发布于 2020 年 12 月 8 日

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

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

静态分析

RBS

RBS 是一种描述 Ruby 程序类型的语言。

包括 TypeProf 在内的类型检查器以及其他支持 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

TypeProf

TypeProf 是 Ruby 包中捆绑的类型分析工具。

目前,TypeProf 充当一种类型推断工具。

它读取纯(非类型注解)Ruby 代码,分析定义了哪些方法以及如何使用它们,并生成 RBS 格式的类型签名原型。

这里有一个 TypeProf 的简单演示。

一个输入示例

# test.rb
class User
  def initialize(name:, age:)
    @name, @age = name, age
  end
  attr_reader :name, :age
end
User.new(name: "John", age: 20)

一个输出示例

$ typeprof test.rb
# Classes
class User
  attr_reader name : String
  attr_reader age : Integer
  def initialize : (name: String, age: Integer) -> [String, Integer]
end

您可以将输入保存为“test.rb”,然后调用名为“typeprof test.rb”的命令来运行 TypeProf。

您还可以 在线尝试 TypeProf。(它在服务器端运行 TypeProf,如果失效,敬请谅解!)

有关更多详细信息,请参阅 文档演示

TypeProf 仍处于实验阶段,尚未成熟;目前仅支持 Ruby 语言的子集,类型错误检测也有限。但它仍在快速发展,以提高语言特性覆盖率、分析性能和可用性。欢迎任何反馈。

Ractor(实验性)

Ractor 是一种类似 Actor 模型并发抽象,旨在提供并行执行功能,而无需担心线程安全。

您可以创建多个 Ractor 并并行运行它们。Ractor 使您能够创建线程安全的并行程序,因为 Ractor 不能共享普通对象。Ractor 之间的通信通过消息传递来支持。

为了限制对象的共享,Ractor 对 Ruby 的语法引入了几项限制(没有多个 Ractor 时,没有限制)。

该规范和实现尚未成熟,未来可能会发生变化,因此此功能被标记为实验性功能,并在首次调用 Ractor.new 时显示“实验性功能”警告。

以下小程序使用两个 Ractor 并行计算 n.prime?n 是一个相对较大的整数)。您将确认,在并行计算机上,程序执行速度大约是顺序程序的 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

Fiber 调度器

Fiber#scheduler 被引入,用于拦截阻塞操作。这使得轻量级并发成为可能,而无需更改现有代码。观看 “Don’t Wait For Me, Scalable Concurrency for Ruby 3” 来了解其工作原理的概述。

当前支持的类/方法

  • Mutex#lock, Mutex#unlock, Mutex#sleep
  • ConditionVariable#wait
  • Queue#pop, SizedQueue#push
  • Thread#join
  • Kernel#sleep
  • Process.wait
  • IO#waitIO#readIO#write 和相关方法(例如 #wait_readable#gets#puts 等)。
  • IO#select不支持。(解释 Async gem 和链接)。此示例程序将并发执行多个 HTTP 请求:(解释此内容:)
    1. async 是外部 gem
    2. async 使用了此新功能
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

其他值得注意的新特性

  • 单行模式匹配现在使用 => 而不是 in
      # version 3.0
      {a: 0, b: 1} => {a:}
      p a # => 0
      # version 2.7
      {a: 0, b: 1} in {a:}
      p a # => 0
    
  • 添加了查找模式。
      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
    
  • 添加了无尽方法定义。
      def square(x) = x * x
    
  • Hash#except 现在是内置的。
      h = { a: 1, b: 2, c: 3 }
      p h.except(:a) #=> {:b=>2, :c=>3}
    
  • 添加了内存视图作为一项实验性功能。
    • 这是一套新的 C-API,用于在扩展库之间交换原始内存区域,例如数值数组和位图图像。扩展库还可以共享由形状、元素格式等组成的内存区域的元数据。使用这些类型的元数据,扩展库可以适当地共享多维数组。此功能的设计参考了 Python 的缓冲区协议。

性能改进

  • MJIT 中实现了许多改进。有关详细信息,请参阅 NEWS。
  • 将长代码粘贴到 IRB 比 Ruby 2.7.0 捆绑的版本快 53 倍。例如,粘贴 此示例代码所需的时间从 11.7 秒减少到 0.22 秒。

自 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
  • 以下默认 gems 现在是打包 gems。
    • rexml
    • rss
  • 以下 stdlib 文件现在是默认 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 以来,这些更改使 3776 个文件已更改,181573 行新增(+),145096 行删除(-)

请尝试 Ruby 3.0.0-preview2,并给我们任何反馈!

下载

  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview2.tar.gz

    SIZE: 19378626
    SHA1: 25363b20225850224e7835e99906c52f2ff57792
    SHA256: 9de8661565c2b1007d91a580e9a7e02d23f1e8fc8df371feb15a2727aa05fd9a
    SHA512: 6fa4191425ae71e41894b60bd9c31d483a562ee8216886360ce18238ab48115b95be0367708612c45f634e7584fba8940a524ba0113ce0f36ce4df78a112d0b7
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview2.tar.xz

    SIZE: 14244252
    SHA1: 54e4d3892ce480106382bd2d36dd7395e01b0f2a
    SHA256: 03078e82d4fb55c13837c69e56565fc49c451d11b1ca5e1b075d990d0957f181
    SHA512: 8b0e6e3ba7e5f95586b4438d965e7b09187ad599f4ac22dec3db7b176358514fe0c0890dde8912fef1ef92ffcde3f6f1228178eabadcf3a05601e5b6f05881ae
    
  • https://cache.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0-preview2.zip

    SIZE: 23907144
    SHA1: 064ee265c94b3df87e737622ba84437ea0d6aeaf
    SHA256: 19e295ae50934ddac2b366f0c7c8de9bd710d596b76eba02152f3641e5ce2b23
    SHA512: 598def50ef9e8ae1f44e05ff2c4e35acf252437286f08644ba5e301ebff2db399140bafa72868877100d6ffa736a4474cb7b99ecea8bdf835ed113ab250bb3d9
    

什么是 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 日

更多新闻...