Scala:无法匹配模式

时间:2017-11-07 11:16:13

标签: scala pattern-matching fold foldleft

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

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

定义了类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:列表[FoldExp] =列表(FoldExp(Hugh,Jass,25岁,男性),FoldExp(Biggus,Dickus,43岁,男性),FoldExp(Incontinentia,Buttocks,37岁,女性))

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"

我想根据年龄将列表中的人分类到各自的乐队中。但是我无法使用模式匹配来实现这一点。谁能告诉我为什么上面的方法是错误的,为实现我的目标需要遵循的方法是什么。任何试图找到上述问题的解决方案都是值得赞赏的。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您不能直接在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。为避免这种情况,您需要默认&#34;全部捕获&#34;最后的案例,如case _ => "Unknown band"

答案 1 :(得分:0)

您的模式匹配不正确,您将条件设置为案例,而不是值,然后是条件。案例类的强大功能(以及许多其他类型)可以通过易于阅读的语法对它们进行模式匹配:

我做了一些测试,对我的工作正常如下(检查默认情况)

 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"