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)
但我认为必须有更好的方法.
提前致谢.
您不能在模式匹配中使用此类语法.但这里有两个选择 - 第一个是使用警卫:
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)
代替