Pattern matching na interpolowaym stringu

Pattern matching na interpolowaym stringu
KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
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,?

Kopiuj
val result: Either[String, String] = "ala ma kota" match {
  case s"$first $rest" => Right(rest)
  case _ => Left("No matched")
}
println (result)
obscurity
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
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
AU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 175
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ąć.

99xmarcin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2420

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.