在Scala中进行模式匹配时,查看如何使用“@ _ *”的示例

时间:2010-02-23 04:07:23

标签: scala operators pattern-matching

我一直在搜索,但在模式匹配案例类时找不到任何演示@ _ *用法的例子。

下面是我所指的那种应用程序的示例。

def findPerimeter(o: SomeObject): Perimeter = o match {
case Type1(length, width) =>
  new Perimeter(0, 0, length, width)
case Type2(radius) =>
  new Perimeter(0, 0, 2*radius, 2*radius)
...

case MixedTypes(group @_*) => {
  \\How could @_* be used to check subpatterns of group?
}

}

如果有人可以向我展示一些示例或指向一个网页,其中包含一些很棒的示例。

由于

2 个答案:

答案 0 :(得分:5)

记住像

这样的东西
Type2(3.0) match {
  case t2 @ Type2(radius) => //...
}

radius绑定到值3.0,并将t2绑定到要匹配的Type2实例。

使用您的示例:

def findPerimeter(o: SomeObject): Perimeter = o match {
  case Type1(length, width) => new Perimeter(0, 0, length, width)
  case Type2(radius) => new Perimeter(0, 0, 2*radius, 2*radius)
  // ...
  // assume that Perimeter defines a + operator
  case MixedTypes(group @ _*) => group.reduceLeft(findPerimeter(_) + findPerimeter(_))

}

此处,group绑定到定义SomeObject的{​​{1}} s序列。你可以对待就像是一个无论构造函数args-for-MixedTypes的序列。

答案 1 :(得分:3)

Wampler / Payne对Scala进行编程an example

另外一些SO问题: Pattern matching a String as Seq[Char]

每日Scala博客文章unapplySeq