Pattern matching na interpolowaym stringu

Pattern matching na interpolowaym stringu
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
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)

Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 godziny
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

"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
AU
  • Rejestracja:ponad rok
  • Ostatnio:12 miesięcy
  • 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:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:2420
1

Holy sh*t, with every month serenityos.org gets better & better...

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.