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

Emr*_*mre 1 scala pattern-matching case-class

我有一个非常简单的案例类,叫做FooPosition:

case class FooPosition(x: Int, y: Int)
Run Code Online (Sandbox Code Playgroud)

和一个Foo有一个FooPosition.我感兴趣的是创建一个函数,该函数仅对于(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
  } 
}
Run Code Online (Sandbox Code Playgroud)

这会导致出现"未找到:值 - "的错误.有趣的是,

val myFoo = FooPosition(1, 0)
val newFoo = FooPosition(myFoo.x - 1, myFoo.y)
Run Code Online (Sandbox Code Playgroud)

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

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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

om-*_*nom 5

您不能在模式匹配中使用此类语法.但这里有两个选择 - 第一个是使用警卫:

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

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

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

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

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

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

代替