斯卡拉(Scala):如何在字面上避免反引号?

时间:2019-04-05 16:42:03

标签: scala literals

Scala中的文学允许定义answer所描述的标识符。有没有办法在字面量中转义反引号`?做类似的事情:

 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 个答案:

答案 0 :(得分:6)

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"
                      ^