簡體   English   中英

Scala:什么是 :: 在 { case x:: y:: _ => y} 中? 方法還是案例類?

[英]Scala: What is :: in { case x :: y :: _ => y}? Method or case class?

object Test1 extends App {
    val list: List[Int] => Int = {
        case x :: y :: _ => y    //what is ::? method or case class?
    }
    println(list(List(1, 2, 3)))    //result is 2.
}

我在 Scala IDE 中設置了“語法着色”,方法的前景顏色我設置為紅色。 代碼截圖: 在此處輸入圖像描述 而且我無法打開black::的聲明,所以我不知道它是什么。

如果black::是方法,應該這樣調用:

... {case _.::(y).::(x) => y}     //compile failed!

那么,什么是黑色:: 方法還是案例類?

非常感謝!

我認為這是此處描述的方法。 為了歷史的緣故,萬一該頁面消失了,這里是簡介:

關於列表上的模式匹配

如果您查看第 15 章中解釋的可能的模式形式,您可能會發現 List(...) 和 :: 看起來都不適合其中定義的一種模式。 事實上,List(...) 是庫定義的提取器模式的一個實例。 此類模式將在第 24 章中處理。“cons”模式 x:: xs 是中綴操作模式的特例。 您已經知道,當被視為表達式時,中綴操作等同於方法調用。 對於模式,規則是不同的:當被視為模式時,中綴運算(例如 p op q)等同於 op(p, q)。 也就是說,中綴運算符 op 被視為構造函數模式。 特別是,像 x:: xs 這樣的 cons 模式被視為 ::(x, xs)。 這暗示應該有一個名為 :: 的類對應於模式構造函數。 確實有這樣的類。 它被命名為 scala.:: 並且正是構建非空列表的類。 So:: 在 Scala 中存在兩次,一次作為 scala 包中的類名,另一次作為類 List 中的方法。 method:: 的作用是生成類 scala.:: 的一個實例。 您將在第 22 章中找到有關如何實現 List 類的更多詳細信息。

所以它是 scala.::(a,b)

這里應用了序列模式。

案例 x:: y:: _ => y

意味着,傳遞的序列第一個值映射到 x,第二個值映射到 y,所有剩余值都應用通配符模式 (_)。

最后,案例返回 y 表示第二個值。

另一個例子:案例 x:: y:: z:: _ => z

本例返回序列中的第三個元素。

另一個例子:案例 _:: _:: z:: _ => z

在此示例中,第一個和第二個元素使用下划線,因為我們不需要這些元素,因此替換為 _。

如果傳遞的列表大小小於預期,它也會拋出異常,例如下面拋出異常:

val third: List[Int] => Int = {case _ :: _ :: z :: _ => z}

third(List(1, 2))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM