Tôi đã đọc và thử nghiệm với tính năng thử thách của phiên bản Scala 2.9 ... và tôi đã suy nghĩ về các khả năng. Tôi thực sự sẽ sử dụng nó để làm gì ngoài việc tiết kiệm một vài dòng mã?Các trường hợp sử dụng cho thử nghiệm của Scala 2.9 ... bắt tổng quát là gì?
Trả lời
Các trường hợp sử dụng là để có thể có xử lý suốt ứng dụng của bạn báo lỗi chung chung. Giả sử bạn muốn xử lý tất cả FileNotFoundException
trong ứng dụng của mình bằng cách gửi e-mail cho quản trị viên. Trước đó, bạn sẽ phải làm điều đó như thế này:
// Globally
val fileNotFound: PartialFunction[Throwable, Unit] = {
case e: FileNotFoundException =>
// Create report and send the e-mail
}
// On each try-catch-block
try {
// Open file
}
catch {
case fnf: FileNotFoundException => fileNotFound(fnf)
}
Bây giờ bạn chỉ cần làm:
try {
// Open file
} catch fileNotFound
này cũng có lợi thế tốt đẹp mà bạn có thể liên kết nhiều bộ xử lý ngoại lệ như vậy bằng cách sử dụng phương pháp orElse
trên một phần chức năng:
val fileErrors = fileNotFound orElse endOfFile orElse invalidFormat
Và sau đó chỉ cần sử dụng ở mọi nơi bạn cần xử lý ngoại lệ tệp. Trình xử lý lỗi như vậy có thể được kết hợp động dựa trên tệp cấu hình cho ứng dụng, ví dụ. Điều này là ít cồng kềnh hơn so với mô hình phù hợp ở khắp mọi nơi và gọi xử lý chính xác.
Một điều hữu ích có thể được pimped trên đầu trang của các chức năng một phần là nhà điều hành andAlso
, hoạt động như một nhà điều hành trình tự trên hai chức năng một phần. Điều này sẽ hữu ích khi bạn muốn thực hiện một số lỗi xử lý cụ thể cho một khối try-catch cụ thể sau khi thực hiện xử lý lỗi chung.
implicit def pf2ops(pf: PartialFunction[Throwable, Unit]) = new {
def andAlso(localpf: PartialFunction[Throwable, Unit]) = new PartialFunction[Throwable, Unit] {
def apply(t: Throwable) = {
if (pf.isDefinedAt(t)) pf(t)
localpf(t)
}
def isDefinedAt(t: Throwable) = pf.isDefinedAt(t) || localpf.isDefinedAt(t)
}
}
Và sau đó bạn có thể làm điều này:
scala> try {
| throw new java.io.FileNotFoundException
| } catch fnf andAlso {
| case e: Exception => println("I don't know, but something is specific to this particular block.")
| }
I don't know, but something is specific to this particular block.
Tôi đoán bạn có thể chơi thêm với ngữ nghĩa chính xác và ý nghĩa (và tên) của andAlso
.
Câu trả lời hay - Tôi nghĩ phần andAlso là phần mà tôi đã bỏ lỡ. – Seth
Câu trả lời hay bởi axel22, nhưng tôi nghĩ lý do thực sự cho phần giới thiệu của nó là thứ gì đó khác. Việc xử lý try
/catch
/finally
đã giới thiệu một trường hợp đặc biệt . Bạn đã sử dụng hàm một phần theo nghĩa đen, nhưng bạn không thể thay thế bằng hàm một phần. Bây giờ, catch
chỉ nhận được một chức năng một phần và một trường hợp đặc biệt khác trong ngôn ngữ đã biến mất.
- 1. Sự phù hợp kiểu cấu trúc tổng quát trong Scala
- 2. Trình ghép mẫu ảo thử nghiệm của scala là gì?
- 3. Tích hợp các trường hợp thử nghiệm PHPT với PHPUnit
- 4. Ghi thử nghiệm Selen cho các trường hợp thử nghiệm Plone chức năng
- 5. Sử dụng trường hợp tổng quát so với phần mở rộng
- 6. settings.maxPrintString cho Scala 2.9 REPL
- 7. Loại thập phân chuẩn trong Scala 2.9 là gì?
- 8. Sự khác biệt trong các lớp trường hợp thử nghiệm Android khác nhau là gì?
- 9. Tổng hợp nhiều trường hợp thử nghiệm từ nhiều mô-đun để chạy trong PyDev TestRunner
- 10. Các trường hợp thử nghiệm với JIRA hoặc Confluence
- 11. Chạy thử nghiệm với hơn một triệu trường hợp thử nghiệm
- 12. Làm thế nào để quản lý các trường hợp thử nghiệm bằng cách sử dụng Confluence?
- 13. Một số trường hợp sử dụng ví dụ cho các ký hiệu chữ cái trong Scala là gì?
- 14. Thử nghiệm khói là gì?
- 15. Trường hợp thử nghiệm riêng biệt trên nhiều tệp trong thử nghiệm google
- 16. Các trường hợp sử dụng cho IdentityHashMap
- 17. Các trường hợp sử dụng cho các chức năng đóng/gọi lại trong JavaScript là gì?
- 18. Đơn vị thử nghiệm Ứng dụng mùa xuân sử dụng Thông số kỹ thuật của Scala
- 19. Trường hợp sử dụng của các nhà thầu phụ trong các lớp trừu tượng là gì?
- 20. Trường hợp không nên sử dụng các trường hợp ở Scala?
- 21. Tổng quát "chuỗi" cho tất cả các functors?
- 22. các công cụ tốt nhất cho các ứng dụng thử nghiệm đơn vị iphone là gì?
- 23. Trường hợp Thử nghiệm Selenium so với Test Suite so với cách sử dụng chung
- 24. "Thử" của Scala có nghĩa là gì nếu không bị bắt hoặc chặn cuối cùng?
- 25. Làm thế nào để sử dụng TDD trong môi trường không phải là "Thử nghiệm"
- 26. Lập kế hoạch cho các trường hợp tử vong trong các thử nghiệm perl
- 27. Scalatest hoặc specs2 với nhiều trường hợp thử nghiệm
- 28. Trường hợp sử dụng cho các chi nhánh mồ côi git là gì?
- 29. Quản lý dữ liệu thử nghiệm cho các thử nghiệm của Junit
- 30. Scala: Kết hợp các lớp trường hợp
Tôi không chắc mình sẽ sử dụng nó .... nhưng bạn có thể sử dụng * any * (conforming) PartialFunction ... có xử lý lỗi thống nhất ở nơi khác không? (Nói 'ignoreTheseSillyClosableExceptions'.) Bên cạnh đó," nó chỉ là mát mẻ "mà Scala có thể diễn tả nó như thế ;-) –
Để cảm hứng: Paul Phillips đã cung cấp một ví dụ động lực khi ông thực hiện điều này: http://www.scala-lang.org/node/8070 –
Câu hỏi sẽ tốt hơn với ví dụ hoặc ít nhất là một liên kết. – ziggystar