Scala 3 — 書籍

情境抽象

語言

在某些情況下,你可以省略被視為重複的方法呼叫參數。

這些參數稱為情境參數,因為它們是由編譯器從方法呼叫周圍的情境推論出來的。

例如,考慮一個透過兩個條件(城市名稱和街道名稱)來對地址清單進行排序的程式。

val addresses: List[Address] = ...

addresses.sortBy(address => (address.city, address.street))

sortBy 方法會採用一個函式,為每個地址傳回一個值,以便將其與其他地址進行比較。在此情況下,我們傳遞一個函式,傳回包含城市名稱和街道名稱的配對。

請注意,我們只指出比較什麼,但沒有指出如何執行比較。排序演算法如何知道如何比較 String 配對?

實際上,sortBy 方法會採用第二個參數,也就是編譯器推論的內容參數。它不會出現在上述範例中,因為它是由編譯器提供的。

這個第二個參數會實作比較方式。省略它很方便,因為我們知道 String 通常會使用字典順序來比較。

不過,也可以明確傳遞它

addresses.sortBy(address => (address.city, address.street))(Ordering.Tuple2(Ordering.String, Ordering.String))
addresses.sortBy(address => (address.city, address.street))(using Ordering.Tuple2(Ordering.String, Ordering.String))

在 Scala 3 中,usingsortBy 的引數清單中表示明確傳遞內容參數,避免歧義。

在此情況下,Ordering.Tuple2(Ordering.String, Ordering.String) 執行個體就是編譯器推論出的執行個體。換句話說,這兩個範例會產生相同的程式。

內容抽象化 用於避免重複程式碼。它們協助開發人員撰寫可擴充且簡潔的程式碼片段。

如需更多詳細資料,請參閱本書的 內容抽象化章節,以及 參考文件

此頁面的貢獻者