Учитывая это RichFile
класс и его компаньон объект:В Scala, как использовать unapplySeq с сопоставлением с образцом, например List, start pattern и varargs parameters?
class RichFile(filePath: String) {
val file = new File(filePath)
}
object RichFile {
def apply(filePath: String) = new RichFile(filePath)
def unapply(rf: RichFile) = {
if (rf == null || rf.file.getAbsolutePath().length() == 0)
None
else {
val basename = rf.file.getName()
val dirname = rf.file.getParent()
val ei = basename.indexOf(".")
if (ei >= 0) {
Some((dirname, basename.substring(0, ei), basename.substring(ei + 1)))
} else {
Some((dirname, basename, ""))
}
}
}
def unapplySeq(rf: RichFile): Option[Seq[String]] = {
val filePath = rf.file.getAbsolutePath()
if (filePath.length() == 0)
None
else
Some(filePath.split("/"))
}
}
В основном я хочу, чтобы извлечь все компоненты пути файла в виде последовательности. Почему соответствие дикой карте не работает в следующем коде? В частности, первый оператор case
Я получаю сообщение об ошибке star patterns must correspond with varargs parameters
.
val l = List(
RichFile("/abc/def/name.txt"),
RichFile("/home/cay/name.txt"),
RichFile("https://stackoverflow.com/a/b/c/d/e"))
l.foreach { f =>
f match {
case RichFile(_*) => println((x, y))
case RichFile(a, b, c) => println((a, b, c))
}
}
Я также хочу, чтобы соответствовать им так же, как мы сопоставляем списки в Scala, что-то вроде этого:
l.foreach { f =>
f match {
case a::b::"def"::tail => println((a, tail))
case RichFile(_*) => println((x, y))
case RichFile(a, b, c) => println((a, b, c))
}
}
Как я могу это сделать с помощью unapplySeq
?
Спасибо за отличное объяснение! – tuxdna