我有一个非常简单的案例类,名为FooPosition:
case class FooPosition(x: Int, y: Int)
和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
}
}
会导致错误,显示“未找到:值 - ”。有趣的是,
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
}
}
但我认为必须有更好的方法。
提前致谢。
答案 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
}
代替