我想有一個Scala函數返回引用另一個函數,這是可能的嗎?斯卡拉:返回引用一個函數
14
A
回答
29
您可以返回一個函數類型(這是由A => B
定義的)。在這種情況下Int to Int:
scala> def f(x:Int): Int => Int = { n:Int => x + n }
f: (x: Int)(Int) => Int
當您調用該函數時,您將獲得一個新函數。
scala> f(2)
res1: (Int) => Int = <function1>
可以稱之爲作爲一個正常的功能:
scala> res1(3)
res2: Int = 5
7
的一種方式(有些獨特的功能性面向對象),可以使用高階函數是創建對象之間的鬆散耦合。
在下面的示例中,類Alarm
有一個方法check4Danger()
,該方法檢查計算值是否超出DangerLevel
。 Alarm類不知道任何關於調用它的對象。
Car
類有一個方法engineCrashRisk()
,該方法返回一個計算髮動機故障風險的匿名函數。 Car
對鬧鐘沒有依賴性。
case class Alarm(temperature: Double, pressure: Double){
val DangerLevel = 100000.0
def check4Danger(f: (Double, Double) => Double): Boolean = {
val risk = f(temperature, pressure)
if(risk > DangerLevel){
println("DANGER: "+ risk)
true
}else{
println("Safe: " + risk)
false
}
}
}
case class Car(fuelRate: Double, milage: Int){
def engineCrashRisk() =
(temperature: Double, pressure: Double) =>
temperature * milage + 2*pressure/fuelRate
}
val car = Car(0.29, 123)
val riskFunc = car.engineCrashRisk
val alarm = Alarm(124, 243)
val risk = alarm.check4Danger(riskFunc)
這個腳本的輸出是:
Safe: 16927.862068965518
在這個例子中,我們使用匿名函數帶密封蓋創建Alarm
和Car
對象間的依賴性免費方法調用。這個例子有什麼意義嗎?
相關問題
- 1. 函數返回值斯卡拉
- 2. 斯卡拉函數返回類型
- 3. 斯卡拉返回
- 4. 如何定義一個函數不返回或斯卡拉
- 5. 斯卡拉:函數返回一個未知類型
- 6. 斯卡拉方法返回一個Future
- 7. 斯卡拉星火 - Map函數引用另一個數據框
- 8. 斯卡拉 - 返回類型
- 9. 斯卡拉getClass.getResource()返回null
- 10. 斯卡拉返回類型
- 11. 斯卡拉foreach返回
- 12. 斯卡拉返回不返回
- 13. 玩斯卡拉返回兩個對象
- 14. 斯卡拉:通過隱含參數的函數會返回另一個功能
- 15. 斯卡拉 - 返回地圖功能在斯卡拉
- 16. 斯卡拉正確使用破返回
- 17. 斯卡拉:覆蓋一個通用的Java方法返回null
- 18. 斯卡拉 - 遞歸函數不返回對象
- 19. 斯卡拉函數返回對象類型
- 20. 斯卡拉匿名函數的語法和返回類型
- 21. 斯卡拉:選擇函數返回選項與PartialFunction
- 22. 斯卡拉:高階函數返回的套
- 23. 斯卡拉對象:通過或從函數返回
- 24. 斯卡拉:匿名函數的返回類型
- 25. 函數返回值中的斯卡拉泛型
- 26. 斯卡拉函數圖
- 27. 斯卡拉:協變函數
- 28. 斯卡拉參考函數在另一個函數
- 29. 斯卡拉理解這兩個函數
- 30. 斯卡拉通過示例:斯卡拉spawn函數2.11.7
+ 1,Offtopic旁邊:請將'DANGER_LEVEL'改爲'DangerLevel'。 Odersky書中推薦使用PascalCase作爲常量。 – missingfaktor 2010-07-29 18:04:26
@Rahuλ沒有狗屎!這個建議感覺完全是非正統的,但我是誰來質疑我們偉大的領導者的意志:-) – 2010-07-30 05:46:14