首页 > 解决方案 > Scala:如何逃避文字中的反引号?

问题描述

Scala 中的文字允许定义标识符,如本答案所述。有没有办法在文字中逃避反引号`?做类似的事情:

 val `hello `world` = "hello world"

更新
其中一个用例是将精炼库用于匹配包含反引号的正则表达式的某些精炼类型,例如:

  import eu.timepit.refined._
  import eu.timepit.refined.api.Refined

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

标签: scalaliterals

解决方案


它不能按原样使用 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"
                      ^

推荐阅读