scala - 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]
解决方案
它不能按原样使用 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"
^
推荐阅读
- css - 粘性页脚在短页面上强制置于底部
- javascript - 如何在画布中将图像绘制为画笔描边
- mongodb - 在不关闭数据库的情况下在 Mongo 中删除 5TB 集合
- javascript - 如何从 ajax 调用异步 MVC 控制器方法
- java - Java RMI Registry.lookup() - 无响应
- graph - 图 API 中的模式扩展
- javascript - Typescript / Javascript 垃圾收集器是否处理循环引用或是否泄漏内存?
- docker - Docker - 重建后文件仍然存在
- kubernetes - Kubernetes 事件日志
- audio - 使用 zsau/id3 在 Clojure 中将元数据写入 mp3 时出错