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