1

我有一个非常简单的案例类,叫做 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
  }
}

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

提前致谢。

4

1 回答 1

5

您不能在模式匹配中使用这种语法。但这里有两种选择——第一种是使用警卫

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
} 

反而

于 2013-05-27T14:40:49.877 回答