我想要實現的數字類型「夾」功能:Int
,Double
,Float
等是否可以使用@specialized Ordered?
(如果它適用於其他東西,比如字符串,那也沒關係,但是這不是我的目標。)
This表明隱含Ordering
的專業化仍然對參數進行箱/拆箱。
但它從來沒有確定是否有解決方案,也許不接受任意Ordering
。
這項工作?
def clamp[@specialized A <% Ordered[A]](low: A, high: A)(value: A) =
if(low > value) {
low
} else if(high < value) {
high
} else {
value
}
還是<%
會導致裝箱和拆箱?
如果是這樣,是爲每個原始類型寫一個單獨的函數我唯一的追索?
編輯:有類似意圖的問題 - How to write a limit function in Scala? - 儘管它要求既沒有仿製藥,也沒有專業化。
這個宏不會多次評估它的參數嗎? – 2014-08-27 23:07:51
@KarolS正確。我用一個只評估一次參數的版本更新了答案(如果可能,跳過評估「高」輸入)。它膨脹了一些代碼,但很好地處理你的輸入是昂貴的功能的情況。感謝您的意見。它可能會進一步優化,以檢測輸入是否是文字,並在編譯時實際進行鉗位,但我不認爲這將是典型的用例。 – KChaloux 2014-08-28 15:31:18