Scala模式匹配 - 从另一个创建新案例对象时出错

时间:2013-05-27 14:34:27

标签: scala pattern-matching case-class

我有一个非常简单的案例类,名为FooPosition:

case class FooPosition(x: Int, y: Int)

FooFooPosition。我感兴趣的是创建一个函数,该函数仅针对(x-1, y)对象的Foo坐标返回-1,并在其他地方返回0。所以我写道:

class Foo(position: FooPosition) {
  def bar = (p: FooPosition) => p match {
    case FooPosition(position.x - 1, position.y) => -1
    case FooPosition(_, _) => 0
  } 
}

会导致错误,显示“未找到:值 - ”。有趣的是,

val myFoo = FooPosition(1, 0)
val newFoo = FooPosition(myFoo.x - 1, myFoo.y)

工作得很好。我在这里显然缺少关于模式匹配的东西(因为我是初学者)。但是这个问题的优雅解决方案是什么?我使用

解决了这个问题
class Foo(position: FooPosition) {
  private val left = FooPosition(position.x - 1, position.y)
  def bar = (p: FooPosition) => p match {
    case `left` => -1
    case FooPosition(_, _) => 0
  }
}

但我认为必须有更好的方法。

提前致谢。

1 个答案:

答案 0 :(得分:5)

您无法在模式匹配中使用此类语法。但这里有两个选项 - 第一个是使用guards

def bar = (p: FooPosition) => p match {
  case FooPosition(x, _) if (x == p.x - 1) => -1
  case _ => 0
} 

这里_表示任何东西,我不关心实际值

其次是按值进行匹配(大写名称的值将与其值匹配,而不是生成新的别名):

def bar = (p: FooPosition) => {
    val Px = p.x - 1
    p match {
      case FooPosition(Px, _) => -1
      case _ => 0
    }
} 

最后,你的代码将始终默认为0 - 你向它提供一些点p,然后期望它的X坐标减去一个单位。也许,你应该写

def bar(p: FooPosition) = p match {
      case FooPosition(x, _) if (x == p.x -1) => -1
      case _ => 0
} 

代替