亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

‘:*’(冒號下劃線星號)在Scala中做什么?

‘:*’(冒號下劃線星號)在Scala中做什么?

‘:*’(冒號下劃線星號)在Scala中做什么?我有以下代碼這個問題:def addChild(n: Node, newChild: Node) = n match {   case Elem(prefix, label, attribs, scope, child @ _*) => Elem(prefix, label, attribs, scope, child ++ newChild : _*)   case _ => error("Can only add children to elements!")}里面的一切都很清楚,除了這段:child ++ newChild : _*是干什么的呢?我知道有Seq[Node]連在一起Node然后呢?什么: _*做?
查看完整描述

3 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

它“碎裂”1序列。

查看構造函數簽名

new Elem(prefix: String, label: String, attributes: MetaData, scope: NamespaceBinding,
         child: Node*)

被稱為

new Elem(prefix, label, attributes, scope,
         child1, child2, ... childN)

但這里只有一個序列child1child2等等,這樣就允許將結果序列用作構造函數的輸入。

編碼愉快。


1這沒有一個可愛的名字在補充,但以下是細節。重要的是,它改變了Scala用重復的參數將參數綁定到方法的方式(如Node*(見上文)。

這個_*類型注釋包括在補充勞工計劃的“4.6.2重復參數”中。

參數部分的最后一個值參數可以是由“*”(例如(.,x:t*)連接的?)。方法中這種重復參數的類型是序列類型Scala.Seq[T]。方法具有重復參數T*的變量數為T型。也就是說,如果方法m具有類型(p1:t1),則為。....,pn:TN,PS:S*)U被應用于參數(E1,。....,ek)其中k>=n,則該應用程序中的m具有類型(p1:t1,。....,pn:TN,PS:S.....,ps0S)U,類型S的k‘n出現,其中超過ps的任何參數名稱都是新的。這個規則的唯一例外是,如果最后一個參數通過_*類型注釋被標記為序列參數。如果上面的m被應用于參數(E1,。....,en,e0:*),則該應用程序中的m類型為(p1:t1,。....,pn:TN,PS:scala.Seq[S])


查看完整回答
反對 回復 2019-06-29
?
UYOU

TA貢獻1878條經驗 獲得超4個贊

  • child ++ newChild

    -序列
  • :

    -類型歸屬,幫助編譯器理解的提示,該表達式具有什么類型?
  • _*

    -接受任何值+vararg運算符的占位符

child ++ newChild : _*膨脹Seq[Node]Node*(告訴編譯器我們使用的是varargs,而不是序列)。對于只能接受varargs的方法特別有用。


查看完整回答
反對 回復 2019-06-29
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

以上所有的答案看起來都很棒,但只是需要一個樣本來解釋這一點。下面是:

val x : Seq[Seq[Int]] = Seq(Seq(1),Seq(2))def f(arg: Seq[Any]*) : Int = {
 arg.length}f(x) //1 as x is taken as single argf(x:_*)  // 2 as x is "unpacked" as a Seq[Any]*

所以現在我們知道了:_*這是為了告訴編譯器:請解壓縮這個參數,并將這些元素綁定到函數調用中的vararg參數,而不是將x作為一個參數。

所以簡單地說,:_*是在將參數傳遞給vararg參數時消除歧義。


查看完整回答
反對 回復 2019-06-29
  • 3 回答
  • 0 關注
  • 849 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號