Стабильный идентификатор в сопоставлении с шаблоном Regex посредством неявного преобразования - PullRequest
0 голосов
/ 03 января 2019

Это работает ...

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

... из-за следующих преобразований:

  1. re"" создает StringContext экземпляр
  2. экземпляр класса RE создается черезнеявное преобразование
  3. член re типа Regex, доступ к которому
  4. unapplySeq() вызывается, и сопоставление с образцом продолжается, как и раньше

Уведомлениечто в этом случае переменная re не должна быть val.Не имеет значения, является ли это val, var или def.Обратите также внимание, что re"" не является отдельной конструкцией.Он не будет компилироваться вне этого контекста сопоставления с образцом.

Итак, если все это достаточно точно, вопрос: где находится стабильный идентификатор?В какой момент это было достигнуто?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...