当前位置: 首页 > 编程笔记 >

Scala序列上的模式匹配

岳俊雅
2023-03-14
本文向大家介绍Scala序列上的模式匹配,包括了Scala序列上的模式匹配的使用技巧和注意事项,需要的朋友参考一下

示例

检查集合中元素的准确数量

def f(ints: Seq[Int]): String = ints match {
  case Seq() =>
      "Seq是空的!"
  case Seq(first) =>
      s"The seq has exactly one element : $first"
  case Seq(first, second) =>
      s"The seq has exactly two elements : $first, $second"
  case  s @ Seq(_, _, _) => 
      s"s is a Seq of length three and looks like ${s}"  // 请注意,各个元素未绑定到它们自己的名称。
  case s: Seq[Int] ifs.length== 4 =>
      s"s is a Seq of Ints of exactly length 4"  // 同样,单个元素不绑定到它们自己的名称。
  case _ =>
      "找不到匹配项!"
}

现场演示

提取first(s) element(s)并将其余部分保留为集合:

def f(ints: Seq[Int]): String = ints match {
  case Seq(first, second, tail @ _*) =>
      s"The seq has at least two elements : $first, $second. The rest of the Seq is $tail"
  case Seq(first, tail @ _*) =>
      s"The seq has at least one element : $first. The rest of the Seq is $tail"
  // 替代语法
  // 在这里当然这将永远不会匹配,因为它检查
  // 与上述相同
  case first +: tail =>
      s"The seq has at least one element : $first. The rest of the Seq is $tail"
  case _ =>
      "The seq didn't match any of the above, so it must be empty"
}

通常,可以用于构建序列的任何形式都可以用于与现有序列进行模式匹配。

请注意,在使用Nil和::在对序列进行模式匹配时将起作用,但确实会将其转换为List,并且可能会产生意外结果。约束自己Seq( ...)并+:避免这种情况。

请注意,虽然使用::不适用于WrappedArray,Vector等等,请参阅:

scala> def f(ints:Seq[Int]) = ints match {
     | case h :: t => h
     | case _ => "No match"
     | }
f: (ints: Seq[Int])Any

scala> f(Array(1,2))
res0: Any = No match

与 +:

scala> def g(ints:Seq[Int]) = ints match {
     | case h+:t => h
     | case _ => "No match"
     | }
g: (ints: Seq[Int])Any

scala> g(Array(1,2).toSeq)
res4: Any = 1
           

 类似资料:
  • 主要内容:实例,实例,使用样例类,实例Scala 提供了强大的模式匹配机制,应用也非常广泛。 一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。 以下是一个简单的整型值模式匹配实例: 实例 object Test {     def main (args : Array [String ] ) {       println (matchTes

  • Scala 提供了强大的模式匹配机制,应用也非常广泛。 一个模式匹配包含了一系列备选项,每个都开始于关键字 case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。 以下是一个简单的整型值模式匹配实例: object Test { def main(args: Array[String]) { println(matchTest(3))

  • 我想消除此示例代码中的类型擦除警告: 它编译和工作正常,但有一个警告: 警告:(31,13)类型模式Seq[Int](Seq[Int]的底层)中的非变量类型参数Int未选中,因为它被擦除情况b消除:Seq[Int]= 在这种情况下,你有什么简单的解决方案来避免擦除吗? 到目前为止,我尝试了什么(根据这一点): 但是它不能编译,因为c现在是Any类型。 我相信这个问题有几种解决方法。我会接受最简单的

  • 本文向大家介绍Elm列表上的模式匹配,包括了Elm列表上的模式匹配的使用技巧和注意事项,需要的朋友参考一下 示例 我们可以像其他任何数据类型一样在列表上进行匹配,尽管它们有些独特,因为用于构建列表的构造函数是infix函数::。(有关更多信息,请参见示例创建列表。) 我们可以根据需要匹配列表中的任意多个元素:            

  • 本文向大家介绍浅谈Scala模式匹配,包括了浅谈Scala模式匹配的使用技巧和注意事项,需要的朋友参考一下 一.scala模式匹配(pattern matching) pattern matching可以说是scala中十分强大的一个语言特性,当然这不是scala独有的,但这不妨碍它成为scala的语言的一大利器。 scala的pattern matching是类似这样的, 其中,变量e后面接一个

  • 我有下面的数据模型,稍后我将对其进行模式匹配: A是层次结构的抽象超类型。C是a的具体子类。a的其他具体子类是B的子类,B又是a的子类。 现在如果我写这样的东西,它是有效的: 然而,在for循环中,我无法与B匹配。我假设我需要一个构造函数模式,但由于B是抽象的,所以B没有构造函数模式。 这里,我只想打印B个实例。这个案子有解决办法吗?