Scala:无法匹配模式

Scala : Unable to match the pattern

我是 Scala 的新手,我正在尝试在 Scala 中执行 = 以下代码:

scala> case class FoldExp(firstname : String, lname : String, age : Int, sex : String)

已定义 class FoldExp

scala> object Foo{
 | def apply(firstname : String, lname : String, age : Int, sex : String) = new FoldExp(firstname,lname,age,sex)
 | }

定义对象 Foo

scala> val foldList = List(Foo("Hugh", "Jass", 25, "male"),Foo("Biggus"," Dickus", 43, "male"),Foo("Incontinentia", "Buttocks", 37, "female"))

foldList: List[FoldExp] = List(FoldExp(Hugh,Jass,25,male), FoldExp(Biggus, Dickus,43,male), FoldExp(Incontinentia,Buttocks,37,female))

val secTry = foldList.foldLeft(List[String]()){(w,f) =>
       val comment = f.age match{
       case (f.age == 25) => "Band A"
       case (f.age > 30) => "Band B"
       case (f.age > 50) => "Band D"
       }
       w:+ s"${f.firstname},${f.age} $comment"

  }

上面的代码块引发了以下错误:

<console>:11: error: not found: value foldList
   val secTry = foldList.foldLeft(List[String]()){(w,f) =>
                ^
<console>:13: error: not found: value ==
              case (f.age == 25) => "Band A"
                          ^
<console>:14: error: not found: value >
              case (f.age > 30) => "Band B"
                          ^
<console>:15: error: not found: value >
              case (f.age > 50) => "Band D"

我想根据年龄将列表中的人分类到各自的组别中。但是我无法使用模式匹配来实现这一点。谁能告诉我为什么上述方法是错误的以及实现我的 objective 应遵循的方法是什么。任何寻求解决上述问题的尝试都值得赞赏。提前致谢。

您的模式匹配不正确,您将条件作为个案,而不是一个值,然后是条件。 case 类 的强大之处在于(除其他外)您可以使用易于阅读的语法对它们进行模式匹配:

我做了一些测试,如下所示(检查默认情况)

 val foldList = List(Foo("William", "Shakespeare", 40, "M"), Foo("Rudyard", "Kipling", 25, "M"))

  val secTry = foldList.foldLeft(List[String]()){(w,f) =>
    val comment = f match{
      case FoldExp(_, _, a, _) if a == 25 => "Band A"
      case FoldExp(_, _, a, _) if a > 50 => "Band D"
      case FoldExp(_, _, a, _) if a > 30 => "Band B"
      case _ => "Band Default"

    }
    w:+ s"${f.firstname},${f.age} $comment"

不能直接将表达式放在 case 子句中。这样的事情应该有效:

 val comment = f.age match {
     case 25 => "Band A"
     case a if a > 50 => "Band D"
     case a if a > 30 => "Band B"

 }

请注意,我交换了 >30>50 的情况,因为匹配语句是按顺序求值的,一旦找到第一个匹配项,求值就会停止。所以,如果 a > 30 出现在 a>50 之前,那么后者将永远不会被执行,因为匹配它的所有内容也会匹配前一个。

另请注意,如果年龄小于 25 岁或年龄在 26 到 29 岁之间,这将抛出 MatchError。为避免这种情况,您需要在末尾使用默认的 "catch all" 情况, 类似于 case _ => "Unknown band"