2016-10-04 82 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特定的方法和匹配器。 –