我正在尝试在scala中编写一个函数,它将根据几个case语句返回Boolean
def my_func(result : Result) : Boolean = {
labResult match {
case (result.name == "test" && result.value >= 10) => false
//more case statements
}
}
但是我在&&
上收到编译错误。有什么方法可以实现这个目标?
答案 0 :(得分:6)
使用带提取器的防护装置
case class Result(name: String, value: Int)
def my_func(result: Result): Boolean = result match {
case Result(name, value) if name == "test" && value >= 10 => false
}
你可以将等式条件纳入提取器
def my_func(result: Result): Boolean = result match {
case Result("test", value) if value >= 10 => false
}
它不会在Scala术语中将其调用为模式匹配。上面的代码是惯用的Scala代码,它具有模式匹配保护和提取器。
不要忘记给出条件不成立的情况,否则你会得到匹配错误
case class Result(name: String, value: Int)
def my_func(result: Result): Boolean = result match {
case Result(name, value) if name == "test" && value >= 10 => false
case _ => true //if above condition fails to match
}
如果您有额外的参数,请使用_
忽略
case class Result(name: String, value: Int, foo: Int)
def my_func(result: Result): Boolean = result match {
case Result(name, value, _) if name == "test" && value >= 10 => false
case _ => true //if above condition fails to match
}
在上面的代码中,我们使用_
忽略了foo。
注意我们可以使用多个_
来忽略多个参数。我们也可以在_
之间使用Result(name, _, foo)
。在这里,我们忽略了value
参数
如果Result
不是case class
,则模式匹配期间的参数提取不起作用因此您必须为Result类编写自定义提取器。
注意在案例类的情况下,Scala编译器会为您编写一个提取器。在普通类的情况下,我们必须编写提取器以进行模式匹配,并使用提取的参数进行工作
class Result (val name: String, val value: Int, val foo: Int)
object Result {
def unapply(result: Result): Option[(String, Int, Int)] = Some((result.name, result.value, result.foo))
}
def my_func(result: Result): Boolean = result match {
case Result(name, value, _) if name == "test" && value >= 10 => false
case _ => true //if above condition fails to match
}
答案 1 :(得分:1)
使用警卫:
def myFunc(result: Result): Boolean = {
result match {
case _ if (result.name == "test" && result.value >= 10) => false
}
}
请注意,如果您使用此方法,您的匹配语句必须详尽无遗且符合所有情况。
或者你可以使用简单的布尔逻辑来进行模式匹配:
def myFunc(result: Result): Boolean = {
(result.name != "test" || result.value < 10) ||
(result.name == "other" && result.value >= 42)
}
答案 2 :(得分:0)
您正在使用匹配错误方式的模式。你必须在模式匹配中专注于pattern
这个词。
您需要做的是,
def my_func(result : Result) : Boolean = {
result match {
case r if (r.name == "test" && r.value >= 10) => false
//more case statements
}
}
在这里,将r if (r.name == "test" && r.value >= 10)
部分视为一种模式。