Me gustaría tener una función Scala que devuelva la referencia a otra función, ¿es posible?Scala: referencia de retorno a una función
Respuesta
Puede devolver un tipo de función (esto está definido por A => B
). En este caso Int to Int:
scala> def f(x:Int): Int => Int = { n:Int => x + n }
f: (x: Int)(Int) => Int
Cuando llama a la función, obtiene una nueva función.
scala> f(2)
res1: (Int) => Int = <function1>
que puede ser llamado como una función normal:
scala> res1(3)
res2: Int = 5
Una forma (algo único a funcional orientación a objetos) puede utilizar las funciones de orden superior es crear acoplamientos sueltos entre los objetos.
En el ejemplo siguiente, la clase Alarm
tiene un método check4Danger()
que comprueba si un valor calculado supera el DangerLevel
. La clase de alarma no sabe nada sobre los objetos que lo llaman.
La clase Car
tiene un método engineCrashRisk()
que devuelve una función anónima que calcula el riesgo de bloqueo del motor. Car
no tiene dependencia a la alarma.
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)
La salida de este script es:
Safe: 16927.862068965518
En este ejemplo hemos usado funciones anónimas con cierres para crear una dependencia método libre llamada entre los Alarm
y Car
objetos. ¿Este ejemplo tiene algún sentido?
- 1. Scala Tipo de retorno
- 2. puntos de retorno múltiples en Scala de cierre/función anónima
- 3. Tipo de retorno Scala para funciones tuple
- 4. tipo de retorno de una función dinámica
- 5. Decltype para el retorno de una función
- 6. Scala: problemas con la instrucción de retorno
- 7. igualdad de referencia Scala
- 8. ¿puedo obtener una función de un método sobrecargado en Scala?
- 9. Scala: ¿Puede una referencia literal en sí?
- 10. ¿Referencia a la función miembro?
- 11. C++ DAL - Retorno de referencia o pueblan aprobada en referencia
- 12. Scala tipo de retorno al extender colección
- 13. retorno en función recursiva
- 14. C++ y const - accediendo a una función miembro de una referencia de referencia
- 15. ¿Cómo puedo pasar una referencia a una función, con parámetros?
- 16. ctypes y pasando una referencia a una función
- 17. pasando una referencia como parámetro llamado a una función variadic
- 18. C#: ¿Cómo pasar null a una función esperando una referencia?
- 19. ¿Hacer referencia a una función en una variable?
- 20. C++: ¿Cómo pasar referencia-a-función a otra función?
- 21. Hace referencia a la función de constructor
- 22. Escribiendo una función de conversión genérica Scala
- 23. ¿Hay una función de identidad scala?
- 24. Java/Scala obtiene una referencia de campo de manera segura
- 25. ¿Cuándo una función parcial scala no es una función parcial?
- 26. referencia indefinida a la función de plantilla
- 27. Almacenar el valor de retorno de la función en la referencia C++
- 28. Retorno no en la función
- 29. ¿Debo dar siempre un valor de retorno a mi función?
- 30. ¿Cómo hacer referencia a una función desde su propia implementación?
+ 1, A un lado de Offtopic: cambie 'DANGER_LEVEL' por' DangerLevel'. El libro de Odersky recomienda el uso de PascalCase para las constantes. – missingfaktor
@ Rahuλ ¡No mierda! Esta recomendación se siente totalmente heterodoxa, pero ¿quién soy para cuestionar la voluntad de nuestro gran líder? :-) –