所以我有一個陣列,我可以這樣做:
myArr.lift(0)
...它讓我可以選擇索引 0 處的值。
那么這里到底發生了什么?當我嘗試去提升定義時,IDE 將我帶到 PartialFunction,我看到 Array 沒有從它繼承。
使用升降機的用例是什么?
uj5u.com熱心網友回復:
確實,它是ArrayJVM 的原始原生并且沒有任何lift方法。
然而,在 Scala 中,我們有隱式轉換和擴展方法,當我們能夠呼叫未為某些型別定義的方法時,這是我們期望找到的。
如果您在 IntelliJ 中撰寫代碼并使用魔術快捷方式來顯示隱式(在金屬中也可用),您會看到您的代碼變成了例如(假設整數陣列):
wrapIntArray(myArr).lift(0)
其中wrapIntArray在scala.Predef(參見 Array 到 ArraySeq 部分)中定義為
implicit def wrapIntArray(xs: Array[Int]): WrappedArray[Int] = if (xs ne null) new WrappedArray.ofInt(xs) else null
(在 Scala 2.13WrappedArray中已棄用并別名為ArraySeq)。
如果你好奇為什么它在你的范圍內,請記住默認情況下 Scala 編譯器會從以下路徑匯入所有定義:
scala- 匯入所有scala.Int和scala.Char其他原語scala.Predef- 為 別名Map,scala.collection.immutable.Map添加包裝器Array,讓您使用println而不是 scala.Console.println 等java.lang- 匯入類似的東西Throwable
(我寫了“默認”,因為您可以更改它,-Yimports但如果您沒有經驗豐富的開發人員和良好的檔案,我不建議您使用自定義預定義)。
的用例是lift什么?基本上所有 Scala 集合都有一些共同的特征,并且PartialFunction是其中之一:
- 您可以
apply用來獲取值,但Exception如果索引/鍵錯誤(例如vector(10))有風險 - 你可以
applyOrElse用來獲取值或一些后備值 - 您可以檢查是否有鍵/索引的內容,
isDefinedAt以便您的集合可用于任何期望的內容,PartialFunction例如coll1.collect(coll2)將所有元素映射coll1到coll2將值coll1視為用于查詢的鍵/索引的值coll2
推理非常簡單 - 如果您訪問集合中的值,就像coll(index)使用函式一樣使用它,但由于它不是一個全映射,它應該是一個部分函式。
For PartialFunctionslift只是一個很好的實用程式,可以回傳Option[Value]而不是Valueor Exceptionon apply,因為WrappedArray就像任何其他集合都繼承自它一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/486216.html
上一篇:在主執行緒上等待回呼方法
