作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 scala 中编写一个函数,该函数将根据多个 case 语句返回一个 Boolean
def my_func(result : Result) : Boolean = {
labResult match {
case (result.name == "test" && result.value >= 10) => false
//more case statements
}
}
但是我在 &&
上遇到编译错误。有什么方法可以做到这一点?
最佳答案
使用带有提取器的守卫
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
}
关于scala - 如何为类使用 scala switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39746614/
我是一名优秀的程序员,十分优秀!