为什么Scala中的模式匹配适用于String
和AnyVal
,例如Int
?
通常我们会看到Case classes
或Extractors
......
答案 0 :(得分:3)
提取器和案例类仅用于13 kinds of patterns in Scala,"提取器模式中的两个"和#34;构造函数模式"分别。您无法使用Int
或String
这种模式(case String(x)
)。但你可以在其他类型中使用它们:
类型化模式,如case x: String
中所示。在这种情况下,String
没有什么特别之处,你可以对任何类做同样的事情(但Int
和其他原语有一些特殊之处:case x: Int
实际检查收到的对象是否是大多数情况下java.lang.Integer
。
文字模式,如case 0
或case ""
。同样,没有什么特别的字符串,这适用于所有文字。
答案 1 :(得分:1)
java.lang.String
内容丰富了scala.collection.immutable.StringOps
(http://www.scala-lang.org/api/2.11.8/#scala.collection.immutable.StringOps),其中混合了scala.collection.immutable.StringLike
(http://www.scala-lang.org/api/2.11.8/#scala.collection.immutable.StringLike)。在那里,您可以找到补充方法,例如应用。< / p>
String
也有点特别,您可以将其转换为Char
列表,然后使用List
提取器,然后使用case List(a,b)
或case x:xs
在String
上,请注意a
和b
将为Char
; x: Char
和xs: List[Char]
所有原始类型都有Rich *类(例如scala.runtime.RichBoolean
,scala.runtime.RichByte
)。
值类机制用于丰富所有上述类型(http://docs.scala-lang.org/overviews/core/value-classes.html)。在编译时,它们有一个包装类型,如RichBoolean
或RichInt
,但在运行时它们是纯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
)。