正则表达式模式中的稳定标识符通过隐式转换进行匹配

时间:2019-01-03 05:34:26

标签: scala pattern-matching implicit-conversion

这有效...

val re = "a.c".r
"abc" match {
  case re() => "HIT"
  case _ => "miss"
}
//res0: String = HIT

...因为Regex类(因此每个Regex实例)都有一个unapplySeq()方法,该方法在模式匹配时被调用。

但是只有在Regex变量reval的情况下,它才有效。如果是vardef,则不会编译Error: not found: value re。我认为这是因为,模式匹配的LHS必须为Stable Identifier,而vars / defs不符合条件。

这也可以...

implicit class RE(sc :StringContext) {
  def re = "a.c".r
}

"abc" match {
  case re"" => "HIT"
  case _ => "miss"
}
//res1: String = HIT

...由于以下转换:

  1. re""创建一个StringContext实例
  2. 通过隐式转换创建类RE的实例
  3. 访问类型为re的成员Regex
  4. unapplySeq()被调用,并且模式匹配与以前一样进行

请注意,在这种情况下,re变量不一定是val。无论是valvar还是def都没有关系。还要注意,re""不是独立的构造。它不会在此模式匹配上下文之外进行编译。

因此,如果所有这一切都相当准确,那么问题是:稳定标识符在哪里?在什么时候实现了?

0 个答案:

没有答案