-1

我是 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: 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"

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

4

2 回答 2

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"

 }

请注意,我交换了>30and>50情况,因为 match 语句是按顺序评估的,并且在找到第一个匹配项后立即停止评估。因此,如果a > 30出现 before a>50,则后者将永远不会被执行,因为与它匹配的所有内容也将与前一个匹配。

MatchError另请注意,如果年龄小于 25 岁或介于 26 到 29 岁之间,这将抛出一个错误。为避免这种情况,您需要在最后使用默认的“catch all”案例,例如case _ => "Unknown band"

于 2017-11-07T14:02:18.703 回答
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"
于 2017-11-07T11:57:11.950 回答