Scala:如何在文字中转义反引号?
Scala: How to escape a backtick in a literal?
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]
Scala 编译器无法按原样完成,但也许使用更改标识符解析方式的编译器插件(也许如果back-tick 的功能不知何故被一些晦涩的 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"
^
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]
Scala 编译器无法按原样完成,但也许使用更改标识符解析方式的编译器插件(也许如果back-tick 的功能不知何故被一些晦涩的 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"
^