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