您好,登錄后才能下訂單哦!
這篇文章主要介紹“scala的隱式參數有什么作用”,在日常操作中,相信很多人在scala的隱式參數有什么作用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”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
的操作,用來創(chuàng)建一個(特定的)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]
的隱式值。第一查找規(guī)則如下
Scala 在調用包含有隱式參數塊的方法時,將首先查找可以直接訪問的隱式定義和隱式參數 (無前綴)。
intMonoid
是一個隱式定義,可以在main
中直接訪問。 并且它的類型也正確,因此它會被自動傳遞給 sum
方法。
第二次調用 sum
方法的時候傳入一個 List[String]
,這意味著此處類型 A
是 String
。 與查找 Int
型的隱式參數時類似,但這次會找到 stringMonoid
,并自動將其作為 m
傳入。
該程序將輸出:
6abc
到此,關于“scala的隱式參數有什么作用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。