正确键入带有冰糕的Ruby多行字符串

toe95027  于 2022-12-18  发布在  Ruby
关注(0)|答案(1)|浏览(149)

我在一个项目中采用了Sorbet,但我不知道应该如何键入以下常量:

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

最快的方法应该是

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

这也是我从vscode得到的快速修复
但这产生了误差

escape sequence meets end of file (2001)


正如预期的那样,因为无法再找到heredoc名称。
所以我试了

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

但这又产生了另一个错误:

T.untyped
unexpected token "," (2001)

有了这个,我不知道该怎么处理。
我知道我可以使用连接操作符(+),但是我不想拆分这个字符串。
我对ruby还是个新手,所以我想问你是否有办法解决这个问题。

h22fl7wq

h22fl7wq1#

你的“最快”方式违反了语法。终止标记 * 必须 * 单独在一行上。
执行此操作时:

QUERY, String)

您放入了终止符标记QUERY以外的内容,因此假定字符串继续。
记住,Ruby有多种引用系统,并且对多行基本上没有影响,例如:

RETRIEVE_FILE_URL_QUERY = "
query($input: ID!) {
  node(id: $input) {
    ... on BulkOperation {
      url
      partialDataUrl
    }
  }
}
".freeze

在那里你也可以使用# frozen_string_literal: true来自动冻结。

相关问题