You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ruby RBS为哈希参数声明严格的Schema?

使用RBS为Ruby哈希参数声明严格Schema的方案

问题背景

我们团队开发的应用大量使用Ruby哈希作为数据传输对象(DTO),目前计划结合RBS与Steep优化开发流程,但不清楚如何为哈希参数声明严格的结构约束。现有Ruby代码如下:

module Foo
  def some_func(args)
    x, y, z = args.values_at(:x, :y, :z)
    # do something with the params above
  end
end

希望通过.rbs文件描述args哈希的结构,实现类似TypeScript中类型定义的效果:

type Args = {
  x: number,
  y: string,
  z: Array<number>
}
function some_func(args: Args): void;

可行方案

完全可以实现,RBS支持通过两种方式定义哈希参数的严格结构:

1. 定义结构体类型(推荐,更贴合DTO语义)

在对应的.rbs文件中,先单独定义一个结构体类型,再用它标注方法参数:

module Foo
  # 定义Args结构体类型,映射哈希的键值结构
  type Args = {
    x: Integer,
    y: String,
    z: Array[Integer]
  }

  # 用定义好的类型标注方法参数
  def some_func: (Args) -> void
end

2. 直接在方法签名中声明哈希结构

如果不需要复用类型,也可以直接在方法签名里写哈希的结构约束:

module Foo
  def some_func: ({ x: Integer, y: String, z: Array[Integer] }) -> void
end

类型校验效果

完成RBS定义后,使用Steep进行类型检查时会严格校验传入的哈希:

  • 缺少x/y/z任意必填键时,会触发类型错误
  • 键对应的值类型不匹配(比如给x传入字符串)时,会抛出错误
  • 额外传入未定义的键(如w: 123),默认会触发警告,可通过Steep配置调整是否允许额外键

内容的提问来源于stack exchange,提问作者TK-95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:01:10