如何为类使用scala switch语句

时间:2016-09-28 11:49:22

标签: scala

我正在尝试在scala中编写一个函数,它将根据几个case语句返回Boolean

def my_func(result : Result) : Boolean = {
  labResult match {
    case (result.name == "test" && result.value >= 10) => false
    //more case statements
  }
}

但是我在&&上收到编译错误。有什么方法可以实现这个目标?

3 个答案:

答案 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)部分视为一种模式。