Tôi muốn có một hàm Scala trả về tham chiếu đến hàm khác, có thể không?Scala: trả về tham chiếu đến hàm
Trả lời
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
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 Alarm
và Car
đối tượng. Ví dụ này có ý nghĩa gì không?
- 1. Gán giá trị cho hàm trả về tham chiếu
- 2. C++ Trả về tham chiếu đến biến cục bộ
- 3. Tại sao vector <bool> :: tham chiếu không trả về tham chiếu đến bool?
- 4. tham chiếu mảng php chuyển đến hàm
- 5. undefined tham chiếu đến một hàm tĩnh
- 6. Trả về tham chiếu không hợp lệ
- 7. Tham số được chuyển bởi tham chiếu const được trả về bởi tham chiếu const
- 8. tham chiếu lớp học về phía trước ở Scala?
- 9. Có tốt không khi tất cả các hàm setter trả về một tham chiếu đến đối tượng trong C++?
- 10. Tuyên bố trả về Scala trong các hàm ẩn danh
- 11. pydev: tìm tất cả các tham chiếu đến hàm
- 12. Thực thi một hàm oracle Trả về một con trỏ tham chiếu trong C#
- 13. Lỗi "Tham chiếu đến hàm" không được xác định
- 14. Scala Trả về một hàm void với 0 tham số, cú pháp xấu xí?
- 15. Tại sao toán tử = trả về tham chiếu không const tham chiếu
- 16. c + + chuyển bản đồ bằng cách tham chiếu đến hàm
- 17. từ C++ đến C#: Không bao giờ trả về một tham chiếu đến một đối tượng cục bộ?
- 18. Phương pháp kế thừa được trả về kiểu tham chiếu
- 19. const tham chiếu đến tối ưu hóa tạm thời so với giá trị trả về
- 20. Tại sao toán tử gán phải trả về một tham chiếu đến đối tượng?
- 21. Tham chiếu đến hàm Lua trong C/C++
- 22. ctypes và chuyển qua tham chiếu đến hàm
- 23. Đi qua tham chiếu đến một hàm tạo
- 24. trở về tham chiếu đến các biến cục bộ
- 25. ngữ nghĩa kiểu trả về tham chiếu giá trị r?
- 26. Các tham chiếu trong sed trả về giá trị sai
- 27. C++: Làm thế nào để chuyển tham chiếu đến hàm thành một hàm khác?
- 28. Lưu trữ tham chiếu đến tham chiếu bằng Python?
- 29. Tham chiếu đến con trỏ
- 30. Scala getClass.getResource() trả về rỗng
+ 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
@ 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 :-) –