Pattern matching na interpolowaym stringu

0

Cześć, Ktoś wie jakim cudem to jest możliwe? Nigdzie nie widzę żeby to mogło być możliwe w dokumentacji a działa. Czy to znowu błąd kompilatora który jest feature'a,?

val result: Either[String, String] = "ala ma kota" match {
  case s"$first $rest" => Right(rest)
  case _ => Left("No matched")
}
println (result)
2

nie wiem, ale fajny feature
wydaje się być po krótce opisany w dokumentacji https://www.scala-lang.org/files/archive/spec/3.4/08-pattern-matching.html#interpolated-string-patterns
chat gpt też rzuca podobnymi przykładami pokazując jak pattern matching rozwija się do użycia unapply:

trait A
case object A extends A {
  def unapply(a: String): Option[A] =
    if (a == "my_a") Some(A) else None
}

trait B
case object B extends B {
  def unapply(b: String): Option[B] =
    if (b == "myB") Some(B) else None
}

val match1 = "myB_my_a" match {
  case s"${B(b)}_${A(a)}" => Some((a, b))
  case _ => None
}
// Result: Some((A, B))

val match2 = "my_a_myB" match {
  case s"${A(a)}_${B(b)}" => Some((a, b))
  case _ => None
}
// Result: None

val match3 = "my_a__myB" match {
  case s"${A(a)}__${B(b)}" => Some((a, b))
  case _ => None
}
// Result: Some((A, B))

val separator = "__"
val match4 = s"my_a${separator}myB" match {
  case s"${A(a)}${`separator`}${B(b)}" => Some((a, b))
  case _ => None
}
// Result: None
0

Nie spotkałem się z czymś takim, ale to wygląda prosto do zaimplementowania na regexach gdzie grupujemy po jakimś separatorze dwie krotki, jeśli jezyk pozwala na takie zaawansowane operacje, to znaczy, że ten regex jest składany na poziomie metadanych języka, w C++ na templatach i constexpr coś takiego zrobisz, gdzie ci constexpr wygeneruje na podstawie stringa regexa, który ci idealnie zmatchuje, zinterpoluje dany string.

Aż tak zaawansowanych metaoperacji nie widziałem normalnie dostępnych, zwykle trzeba to ręcznie osiągnąć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1