val num = 3
val x = if (func(num) > 3) func(num) else 4
我怎樣才能避免func(num)在這里打兩次電話?我的專案功能齊全,因此func(num)保證兩次呼叫會產生相同的結果。編譯器會自動優化嗎?我知道這一點:
val num = 3
val x = List(num).map(f(_)).map(a => if (a > 3) a else 4).head
編輯:我正在尋找一種方法來改善這一點
val temp = tl.indexWhere(<bool>)
val insertIndex = if(temp == -1) tl.size else temp
uj5u.com熱心網友回復:
Scala 編譯器通常不知道一個函式是否是純函式,因此它無法自動執行該優化。
val temp = tl.indexWhere(???)
val insertIndex = if(temp == -1) tl.size else temp
很可能是這個邏輯的最清晰和(通過明確防止雙重評估)最高效的表達。假設這temp是一個區域變數,Scala 編譯器可以看到它稍后不會在您的函式/方法中使用并重用區域變數槽。
uj5u.com熱心網友回復:
萬一你想清楚地表明區域變數只用于這個特定的代碼塊,你可以使用......一個代碼塊:
val insertIndex = { val temp = tl.indexWhere(<bool>); if (temp == -1) tl.size else temp }
或者
val insertIndex = {
val temp = tl.indexWhere(<bool>)
if (temp == -1) tl.size else temp
}
正如另一個答案中提到的,Scala 通常不能知道這tl.indexWhere是純粹的,因為純度分析等同于解決停機問題。
uj5u.com熱心網友回復:
不確定這是否是一種改進,但您可以將模式匹配與警衛一起使用:
val num = 3
val x = num match {
case v if v > 3 => v
case _ => 4
}
或者在第二種情況下:
val insertIndex = tl.indexWhere(...) match {
case -1 => tl.size
case v => v
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/486230.html
