Scala中String和Int的模式匹配

时间:2016-10-04 07:47:28

标签: scala pattern-matching

为什么Scala中的模式匹配适用于StringAnyVal,例如Int

通常我们会看到Case classesExtractors ......

等内容

4 个答案:

答案 0 :(得分:3)

提取器和案例类仅用于13 kinds of patterns in Scala,"提取器模式中的两个"和#34;构造函数模式"分别。您无法使用IntString这种模式(case String(x))。但你可以在其他类型中使用它们:

  1. 类型化模式,如case x: String中所示。在这种情况下,String没有什么特别之处,你可以对任何类做同样的事情(但Int和其他原语有一些特殊之处:case x: Int实际检查收到的对象是否是大多数情况下java.lang.Integer

  2. 文字模式,如case 0case ""。同样,没有什么特别的字符串,这适用于所有文字。

答案 1 :(得分:1)

java.lang.String内容丰富了scala.collection.immutable.StringOpshttp://www.scala-lang.org/api/2.11.8/#scala.collection.immutable.StringOps),其中混合了scala.collection.immutable.StringLikehttp://www.scala-lang.org/api/2.11.8/#scala.collection.immutable.StringLike)。在那里,您可以找到补充方法,例如应用。< / p>

String也有点特别,您可以将其转换为Char列表,然后使用List提取器,然后使用case List(a,b)case x:xsString上,请注意ab将为Char; x: Charxs: List[Char]

所有原始类型都有Rich *类(例如scala.runtime.RichBooleanscala.runtime.RichByte)。

值类机制用于丰富所有上述类型(http://docs.scala-lang.org/overviews/core/value-classes.html)。在编译时,它们有一个包装类型,如RichBooleanRichInt,但在运行时它们是纯Boolean或Int类型。这样可以避免创建运行时对象的开销。

答案 2 :(得分:0)

val x: Any = 5
def f[T](v: T) = v match {
  case _: Int    => "Int"
  case _: String => "String"
  case _         => "Unknown"
}

答案 3 :(得分:0)

您无需在类中定义unapply即可在switch/case样式模式匹配中使用该类。 unapply用于解构对象,因此,如果要匹配List - style(case x:xs)中的切换,则应使用unapply/unapplySeq。这里的好例子是正则表达式,它们是用字符串构造的 - "something".r(最后注意.r)。