bas*_*h0r 3 scala pattern-matching
我正在玩Scala的模式匹配.到目前为止我所知道的是,一个名为operator的提取器是左关联的,一个名为方法或类型的提取器是右关联的.
我目前的方法看起来像这样:
object Foo {
def unapply(tokens: Seq[String]): Option[(Seq[String], String)] = // do something
}
// ...
object Main extends App {
Seq("hi", "bye") match {
case xs Foo foo2 Foo foo1 => // do something with result
case _ => // handle error
}
}
Run Code Online (Sandbox Code Playgroud)
这有点不愉快,因为它需要我反向编写我的匹配或由于正确的关联性而反向匹配它们.我更愿意,如果我能写这样的东西:
object Foo {
def unapply(tokens: Seq[String]): Option[(String, Seq[String])] = // do something
}
// ...
object Main extends App {
Seq("hi", "bye") match {
case foo1 Foo foo2 xs => // do something with result
case _ => // handle error
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法为提取器保留一些可读的名称并使其保持关联状态?
提前致谢.
你需要用一个结束你的班级名称:.
来自Scala规范(Infix Operations,6.12.3):
操作员的关联性由操作员的最后一个字符决定.以冒号':'结尾的运算符是右关联的.所有其他运算符都是左关联的.
这条路:
scala> object `Foo:` {
def unapply(tokens: Seq[String]): Option[(String, Seq[String])] =
Some((tokens.head, tokens.tail))
}
defined object Foo$colon
scala> Seq("hi", "bye", "world") match {
case foo1 `Foo:` foo2 `Foo:` foo3 => println(s"$foo1 $foo2 $foo3")
}
hi bye List(world)
Run Code Online (Sandbox Code Playgroud)
不幸的是,您需要使用反引号,因为Foo:它不是有效的标识符.