Scala: 如何在字面量中转义反引号?

8

在Scala中,文字量允许将标识符定义为答案中所描述的形式。但是,是否有一种方法可以在文字量中转义反引号`? 例如执行以下操作:

 val `hello `world` = "hello world"
更新:
其中一个应用场景是使用refined库来匹配包含反引号的正则表达式,以获取一些细化类型。
  import eu.timepit.refined._
  import eu.timepit.refined.api.Refined

  type MatchesRegexWithBacktick = String Refined MatchesRegex[W.`(a|`)`.T]

1
为什么不能使用其他符号,例如撇号 val `hello 'world` = "hello world" - Dmytro Mitin
简短的回答是我正在使用 refined 库。我想定义一种特定类型,该类型与正则表达式匹配,而且正则表达式包含反引号... String Refined MatchesRegex[W.someRegexWithBackTick.T](我不得不删除 someRegexWithBackTick 周围的反引号,因为它会破坏格式)。 - Valy Dia
1
长答案在这里:链接 @DmytroMitin - Valy Dia
1个回答

7
无法使用现有的Scala编译器完成此操作,但也许可以通过更改标识符解析方式的编译器插件实现(也许可以用某些晦涩的Unicode字符替换反引号的功能)。
Scala SLS 1.1中,有关于标识符的词法语法。
op       ::=  opchar {opchar}
varid    ::=  lower idrest
boundvarid ::=  varid
             | ‘`’ varid ‘`’
plainid  ::=  upper idrest
           |  varid
           |  op
id       ::=  plainid
           |  ‘`’ { charNoBackQuoteOrNewline | UnicodeEscape | charEscapeSeq } ‘`’
idrest   ::=  {letter | digit} [‘_’ op]

问题是,唯一允许使用字母、数字或_以外字符的规则是要求用反引号引用标识符的规则:
`’ { charNoBackQuoteOrNewline | UnicodeEscape | charEscapeSeq } ‘`

然而,charNoBackQuoteOrNewline 明确不允许使用反引号,如果你试图通过 UnicodeEscape 来解决这个问题,那也不行:

scala> val `hello \u0060world` = "hello world"
<console>:1: error: unclosed quoted identifier
val `hello \u0060world` = "hello world"
                      ^

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接