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

如何使用Sorbet为Ruby中的多行字符串常量正确类型标注

解决Sorbet中Heredoc常量的类型标注问题

针对你遇到的Heredoc常量在Sorbet中类型标注的语法错误,以下是几种可行的解决方法:

方法1:拆分T.let参数到多行(推荐)

将T.let的参数拆分为多行,让Heredoc的结束标记清晰独立,同时保留freeze:

RETRIEVE_FILE_URL_QUERY = T.let(
  <<~QUERY.freeze,
  query($input: ID!) {
    node(id: $input) {
      ... on BulkOperation {
        url
        partialDataUrl
      }
    }
  }
  QUERY
  String
)

此写法中,Heredoc作为T.let的第一个参数,结束标记QUERY后紧跟逗号分隔类型参数,Ruby能正确识别Heredoc边界,Sorbet也能正常解析类型标注。

方法2:冻结操作移到T.let外部

如果觉得把freeze放在Heredoc后面不够直观,可以将冻结操作移到T.let调用之后:

RETRIEVE_FILE_URL_QUERY = T.let(
  <<~QUERY,
  query($input: ID!) {
    node(id: $input) {
      ... on BulkOperation {
        url
        partialDataUrl
      }
    }
  }
  QUERY
  String
).freeze

这种方式将类型标注和常量冻结逻辑分离,代码结构更清晰。

方法3:简洁单行参数写法

也可以保持紧凑的写法,只要确保Heredoc结束标记是单独一行:

RETRIEVE_FILE_URL_QUERY = T.let(<<~QUERY.freeze, String)
query($input: ID!) {
  node(id: $input) {
    ... on BulkOperation {
      url
      partialDataUrl
    }
  }
}
QUERY

这里T.let的两个参数在同一行声明,Heredoc内容和结束标记在下方,Ruby能正确识别结束标记,不会出现解析错误。

错误原因说明

你之前的写法错误在于:

  • 第一种写法中,Heredoc结束标记QUERY后直接跟逗号,导致Ruby将QUERY,视为Heredoc的一部分,无法找到正确的结束边界。
  • 第二种写法中,换行后的逗号位置不符合T.let的参数语法,Sorbet无法正确解析类型参数。

只要保证Heredoc的结束标记是单独一行,且T.let的参数格式符合Ruby语法,就能顺利完成类型标注。

内容的提问来源于stack exchange,提问作者Nullndr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:20:20