2016-10-04 86 views

回答

3

提取器和案例类仅用于13 kinds of patterns in Scala中的两个,分别是“提取器模式”和“构造器模式”。您在不能使用使用IntString这种模式(case String(x))。但是你可以在其他类型的使用:

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

  2. 字形,如case 0case ""。再一次,没有什么特别的字符串,这适用于所有文字。

+0

感谢您的链接。我不知道所有这些模式。 – rapt

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

我在问为什么它有效。字符串是java.lang.String的别名,它既不是一个案例类不是提取器,纠正我,如果我错了。 – rapt

0

您不必在类中定义unapply到能够使用类switch/case风格的模式匹配。 unapply用于解构对象,因此,如果要匹配List-style(case x:xs)中的开关,则应该使用unapply/unapplySeq。这里的好例子是正则表达式,它们是从字符串构造的 - "something".r(最后注意.r)。

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)。在那里,你可以找到互补的方法,如适用。

String是有点特别的好,你可以将其转换的Char的名单,并使用List提取然后像case List(a,b)case x:xsString,记住abChar S轴承; x: Charxs: List[Char]

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

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

+1

“字符串也有点特别,因为它只是一个Chars列表,这意味着您可以使用List提取程序(如大小写列表(a,b))或案例x:字符串上的xs”试试吧。 –

+0

@AlexeyRomanov你是对的,你需要'toList'才能工作。我诚实地认为这将工作没有额外的努力%)。我将编辑这个answear。 – iuriisusuk

+0

即便如此,将字符串转换为“List [Char]”也相当缓慢,结果列表比'String'需要更多的内存。 _Much_最好使用'toSeq'(或者隐式转换为'Seq [Char]'),它只会创建一个小包装器对象,并使用Seq特定的方法和匹配器。 –