2013-03-06 35 views
5

tôi đã sử dụng mã play framework trong scala mà trông giống như sau:Khi nào tôi nên thực hiện các phương pháp với đối số ngầm trong Scala?

object Application extends Controller { 
    def hoge = Action(implicit request => 
    val username = MyCookie.getName.get 
    Ok("hello " + username) 
    } 
} 

object MyCookie { 
    def getName(implicit request: RequestHeader) = { 
    request.cookies.get("name").map(_.value) 
    } 
} 

tôi đã xem xét mã từ đồng nghiệp của tôi. Ông nói mã này không thể đọc được vì tham số ngầm định. Tôi không thể trả lời ý kiến ​​của anh ta. Vì vậy, bạn có thể cho tôi biết cách tốt nhất để sử dụng các thông số tiềm ẩn là gì? Khi nào tôi nên sử dụng các tham số ngầm?

+1

có thể trùng lặp của [Ví dụ về tham số ngầm trong Scala?] (Http://stackoverflow.com/questions/9530893/good-example-of-implicit-parameter-in-scala) –

+0

Cảm ơn Brian. Bạn đúng rồi. – buster84

Trả lời

11

Bạn nên sử dụng các tham số ngầm khi gần như luôn có cách "đúng" để thực hiện mọi việc và bạn muốn bỏ qua các chi tiết đó hầu như mọi lúc; hoặc khi thường có không cách để thực hiện mọi việc và hàm ý cung cấp chức năng cho những thứ hoạt động.

Để biết ví dụ về trường hợp đầu tiên, trong scala.concurrent.Future, hầu hết mọi phương thức đều mất một số ExecutionContext ẩn. Bạn gần như không bao giờ quan tâm những gì ExecutionContext của bạn là từ cuộc gọi đến cuộc gọi; bạn chỉ muốn nó hoạt động. Nhưng khi bạn cần thay đổi ngữ cảnh thực thi, bạn có thể cung cấp nó như một tham số rõ ràng.

Ví dụ về trường hợp thứ hai, hãy xem CanBuildFrom s trong thư viện bộ sưu tập. Bạn không thể xây dựng được gì từ bất kì cái gì; một số khả năng nhất định được cung cấp, và thiếu sự ngầm định rằng, cho phép bạn đóng gói một bó của Vector[Option[String]] s vào một HashSet[Char] là một cách chính để giữ cho thư viện mạnh mẽ và linh hoạt chưa lành mạnh.

Bạn đang làm không: dường như bạn chỉ sử dụng nó để tiết kiệm một chút đánh máy tại một chỗ với chi phí của điểm khác. Và, trong trường hợp này, khi làm như vậy bạn đã làm cho nó ít rõ ràng hơn cách mọi thứ hoạt động, vì bạn phải nhìn khắp nơi để tìm ra nơi mà yêu cầu tiềm ẩn thực sự được sử dụng. Nếu bạn muốn lưu nhập, bạn nên sử dụng các tên biến ngắn hơn nhưng hãy rõ ràng về điều này:

Action{ req => val name = MyCookie.getName(req).get; Ok("hello "+name) } 
Các vấn đề liên quan