关于Sorbet为Ruby匿名转发块添加类型签名的问询
关于Ruby 3.1匿名块转发的Sorbet类型签名支持问题
结论
目前Sorbet不支持为Ruby 3.1引入的匿名块转发语法(def do_something(&))添加显式类型签名。
原因说明
Sorbet的签名解析逻辑中,&是块参数的语法标记,而非合法的参数标识符。尝试类似sig { params(:& => T.proc) }的写法时,会触发签名格式错误或参数名称未知的报错——因为Sorbet无法识别单独的&作为参数名在签名中声明。
替代方案
若需要为转发的块添加类型约束,可改用具名块参数的写法,示例如下:
# 为块指定具体的类型(此处以无参数无返回值为例) sig { params(block: T.proc.void).void } def do_something(&block) # 执行块转发逻辑 target_method(&block) end
这种写法既符合Sorbet的签名规则,也能实现块转发功能。如果Rubocop默认强制匿名块写法,可调整Style/BlockForwarding规则的配置,允许具名块参数的使用。
文档优化建议
当前Sorbet官方文档仅提及隐式yield块无法添加类型签名,未覆盖显式匿名块转发的场景。你可以通过Sorbet的代码仓库提交反馈,建议补充文档说明或让类型检查器在遇到此类写法时给出明确的不支持提示。
内容的提问来源于stack exchange,提问作者Roland Crosby
相关产品推荐
相关产品推荐

