Mi piacerebbe avere una funzione Scala che restituisce il riferimento a un'altra funzione, è possibile?Scala: riferimento di ritorno a una funzione
risposta
È possibile restituire un tipo di funzione (definito da A => B
). In questo caso Int a Int:
scala> def f(x:Int): Int => Int = { n:Int => x + n }
f: (x: Int)(Int) => Int
Quando si chiama la funzione si ottiene una nuova funzione.
scala> f(2)
res1: (Int) => Int = <function1>
che può essere chiamato come una funzione normale:
scala> res1(3)
res2: Int = 5
Una direzione (in qualche modo unico per oggetto-orientamento funzionale) è possibile utilizzare funzioni di ordine superiore è creare accoppiamenti flessibili tra oggetti.
Nell'esempio seguente, la classe Alarm
ha un metodo check4Danger()
che verifica se un valore calcolato supera DangerLevel
. La classe Alarm non sa nulla degli oggetti che la chiamano.
La classe Car
ha un metodo engineCrashRisk()
che restituisce una funzione anonima che calcola il rischio di arresto anomalo del motore. Car
non ha dipendenza da allarme.
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)
L'output di questo script è:
Safe: 16927.862068965518
In questo esempio abbiamo usato funzioni anonime con chiusure di creare un metodo libero chiamata dipendenza tra i Alarm
e Car
oggetti. Questo esempio ha senso?
- 1. Passando valore di ritorno di una funzione come riferimento
- 2. Ignorare un risultato di ritorno per riferimento di una funzione
- 3. punti di ritorno multipli in scala di chiusura/funzione anonima
- 4. Modifica più liste all'interno di una funzione e il ritorno a Scala
- 5. Scala tipo di ritorno
- 6. Memorizza valore di ritorno della funzione in riferimento C++
- 7. ritorno con riferimento rvalue
- 8. tipo di ritorno dinamico di una funzione
- 9. Erlang: ritorno da una funzione
- 10. Ritorno puntatore di classe da una funzione
- 11. Generatore di ritorno da una funzione
- 12. Ritorno in Scala
- 13. Istruzioni di ritorno Scala in funzioni anonime
- 14. Controllo Tipo Funzione a Scala
- 15. Differenza tra il ritorno di un riferimento const e il riferimento del valore di riferimento
- 16. si tratta di una pura funzione a Scala
- 17. risoluzione del riferimento e ritorno con riferimento
- 18. tentativo di fare riferimento a una funzione cancellata
- 19. ctypes e passaggio di un riferimento a una funzione
- 20. passaggio di vettori a una funzione, valore vs riferimento C++
- 21. puntatore a funzione vs riferimento Funzione
- 22. statico tipo di ritorno di Scala macro
- 23. posso ottenere una funzione da un metodo sovraccarico in scala?
- 24. Esiste una funzione di scala identità?
- 25. Tipo di funzione con ricevitore a Scala
- 26. avvertimento: il ritorno riferimento alla temporanea
- 27. Riferimento all'elemento di vettore restituito da una funzione in C++
- 28. ritorno due variabili in una funzione
- 29. UICollectionReusableView - Ritorno mancante in una funzione
- 30. Ritorno per riferimento in PHP
+ 1, Offtopic a parte: Si prega di cambiare 'DANGER_LEVEL' su' DangerLevel'. Il libro di Odersky raccomanda l'uso di PascalCase per le costanti. – missingfaktor
@ Rahuλ No merda! Questa raccomandazione sembra totalmente non ortodossa, ma chi sono io per mettere in discussione la volontà del nostro grande leader :-) –