日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

传递list对象作为参数_24.scala的隐式参数

發布時間:2025/3/21 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 传递list对象作为参数_24.scala的隐式参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

方法可以具有 隱式 參數列表,由參數列表開頭的 implicit 關鍵字標記。 如果參數列表中的參數沒有像往常一樣傳遞, Scala 將查看它是否可以獲得正確類型的隱式值,如果可以,則自動傳遞。

Scala 將查找這些參數的位置分為兩類:

  • Scala 在調用包含有隱式參數塊的方法時,將首先查找可以直接訪問的隱式定義和隱式參數 (無前綴)。

  • 然后,它在所有伴生對象中查找與隱式候選類型相關的有隱式標記的成員。

更加詳細的關于 Scala 到哪里查找隱式參數的指南請參考 常見問題

在下面的例子中,我們定義了一個方法 sum,它使用 Monoid 類的 add 和 unit 方法計算一個列表中元素的總和。請注意,隱式值不能是頂級值。

abstract class Monoid[A] { def add(x: A, y: A): A def unit: A}object ImplicitTest { implicit val stringMonoid: Monoid[String] = new Monoid[String] { def add(x: String, y: String): String = x concat y def unit: String = "" } implicit val intMonoid: Monoid[Int] = new Monoid[Int] { def add(x: Int, y: Int): Int = x + y def unit: Int = 0 } def sum[A](xs: List[A])(implicit m: Monoid[A]): A = if (xs.isEmpty) m.unit else m.add(xs.head, sum(xs.tail)) def main(args: Array[String]): Unit = { println(sum(List(1, 2, 3))) println(sum(List("a", "b", "c"))) }}

類 Monoid 定義了一個名為 add 的操作,它將一對 A 類型的值相加并返回一個 A,以及一個名為 unit 的操作,用來創建一個(特定的)A 類型的值。

為了說明隱式參數如何工作,我們首先分別為字符串和整數定義 Monoid 實例, StringMonoid 和 IntMonoid。implicit 關鍵字表示可以隱式使用相應的對象。

方法 sum 接受一個 List[A],并返回一個 A 的值,它從 unit 中取初始的 A 值,并使用 add 方法依次將列表中的下一個 A 值相加。在這里將參數 m 定義為隱式意味著,如果 Scala 可以找到隱式 Monoid[A] 用于隱式參數 m,我們在調用 sum 方法時只需要傳入 xs 參數。

在 main 方法中我們調用了 sum 方法兩次,并且只傳入參數 xs。Scala 會在上例的上下文范圍內尋找隱式值。第一次調用 sum 方法的時候傳入了一個 List[Int] 作為 xs 的值,這意味著此處類型 A 是 Int。隱式參數列表 m 被省略了,因此 Scala 將查找類型為 Monoid[Int] 的隱式值。第一查找規則如下

Scala 在調用包含有隱式參數塊的方法時,將首先查找可以直接訪問的隱式定義和隱式參數 (無前綴)。

intMonoid 是一個隱式定義,可以在main中直接訪問。 并且它的類型也正確,因此它會被自動傳遞給 sum 方法。

第二次調用 sum 方法的時候傳入一個 List[String],這意味著此處類型 A 是 String。 與查找 Int 型的隱式參數時類似,但這次會找到 stringMonoid,并自動將其作為 m 傳入。

該程序將輸出:

6abc

推薦閱讀:

23.scala的自類型

22.scala的復合類型

21.scala的抽象類型

20.scala的內部類

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的传递list对象作为参数_24.scala的隐式参数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。