2010-07-29 51 views

Trả lời

29

Bạn có thể trả lại loại hàm (điều này được xác định bởi A => B). Trong trường hợp này Int đến Int:

scala> def f(x:Int): Int => Int = { n:Int => x + n } 
f: (x: Int)(Int) => Int 

Khi bạn gọi hàm, bạn có chức năng mới.

scala> f(2) 
res1: (Int) => Int = <function1> 

Mà có thể được gọi là một chức năng bình thường:

scala> res1(3) 
res2: Int = 5 
7

Một cách (hơi độc đáo cho chức năng hướng đối tượng), bạn có thể sử dụng chức năng bậc cao là tạo ra khớp nối lỏng lẻo giữa đối tượng.

Trong ví dụ bên dưới lớp Alarm có phương thức check4Danger() kiểm tra xem giá trị được tính vượt quá DangerLevel hay chưa. Lớp Alarm không biết gì về các đối tượng gọi nó.

Lớp Car có phương thức engineCrashRisk() trả về một hàm ẩn danh tính toán nguy cơ hỏng máy. Car không có phụ thuộc vào Báo thức.

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) 

Kết quả của kịch bản này là:

Safe: 16927.862068965518 

Trong ví dụ này chúng tôi sử dụng các chức năng ẩn danh với đóng cửa để tạo ra một sự phụ thuộc phương thức gọi miễn phí giữa AlarmCar đối tượng. Ví dụ này có ý nghĩa gì không?

+0

+ 1, Offtopic sang một bên: Vui lòng thay đổi 'DANGER_LEVEL' thành' DangerLevel'. Odersky cuốn sách khuyến cáo sử dụng PascalCase cho hằng số. – missingfaktor

+4

@ Rahuλ Không shit! Đề nghị này cảm thấy hoàn toàn không chính thống, nhưng tôi là ai để đặt câu hỏi ý muốn của nhà lãnh đạo tuyệt vời của chúng tôi :-) –

Các vấn đề liên quan