Это работает ...
val re = "a.c".r
"abc" match {
case re() => "HIT"
case _ => "miss"
}
//res0: String = HIT
... потому что класс Regex
и, следовательно, каждый экземпляр Regex
, имеет метод unapplySeq()
, который вызывается при сопоставлении с образцом.
Но это работает, только если переменная Regex
, в данном случае re
, равна val
.Если это var
или def
, то он не скомпилируется, Error: not found: value re
.Это потому, что я считаю, что LHS соответствия шаблона должен быть Стабильный идентификатор , а vars / defs не подходят.
Это также работает ...
implicit class RE(sc :StringContext) {
def re = "a.c".r
}
"abc" match {
case re"" => "HIT"
case _ => "miss"
}
//res1: String = HIT
... из-за следующих преобразований:
re""
создает StringContext
экземпляр - экземпляр класса
RE
создается черезнеявное преобразование - член
re
типа Regex
, доступ к которому unapplySeq()
вызывается, и сопоставление с образцом продолжается, как и раньше
Уведомлениечто в этом случае переменная re
не должна быть val
.Не имеет значения, является ли это val
, var
или def
.Обратите также внимание, что re""
не является отдельной конструкцией.Он не будет компилироваться вне этого контекста сопоставления с образцом.
Итак, если все это достаточно точно, вопрос: где находится стабильный идентификатор?В какой момент это было достигнуто?