2010-07-29 7 views

답변

29

함수 유형을 반환 할 수 있습니다 (A => B으로 정의 됨). 이 경우 Int 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 아래 예에서

은 계산 된 값을 초과하는 경우 DangerLevel 검사 방법 check4Danger()있다. Alarm 클래스는이를 호출하는 객체에 대해 아무것도 모릅니다.

클래스 Car 클래스에는 엔진 크래시 위험을 계산하는 익명 함수를 반환하는 engineCrashRisk() 메서드가 있습니다. Car에는 Alarm에 대한 종속성이 없습니다.

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 

이 예에서 우리는 AlarmCar 오브젝트 간의 의존 관계없는 방법 호출을 생성하는 클로저 익명 함수를 사용 하였다. 이 예제가 의미가 있습니까?

+0

+1, Offtopic aside :'DANGER_LEVEL'을'DangerLevel'로 변경하십시오. Odersky 책에서는 상수에 PascalCase를 사용할 것을 권장합니다. – missingfaktor

+4

@ Rahuλ 아니 젠장! 이 권고안은 완전히 정통적이라고 느낀다. 그러나 나는 위대한 지도자의 의지에 질문해야한다 :-) –