2015-12-21 17 views
9

Để giảm thời gian biên dịch của dự án, tôi đang lưu vào bộ nhớ cache một số loại lớp nhất định được giải quyết bằng tra cứu ngầm định. Điều này dường như hơi rườm rà tuy nhiên, vì việc thực hiện thẳng về phía trước không hoạt động:Giải quyết ngầm ẩn bộ nhớ

scala> implicit val x: String = implicitly[String] 
x: String = null 

Các tra cứu ngầm xem xét riêng, định nghĩa chưa được khởi tạo của nó như là một thực hợp lệ. Một lazy val sẽ thổi các ngăn xếp với đệ quy vô hạn. Vì vậy tôi đang xử lý nó theo cách này:

implicit val x: String = cache.x 

object cache { 
    val x: String = implicitly[String] 
} 

Nhưng điều này làm cho nó quá phức tạp, và bộ nhớ cache-định nghĩa không thể tận dụng các lớp học kiểu cache khác một cách dễ dàng (vì chúng là không tiềm ẩn).

Ngoài ra, việc ẩn chính giá trị khỏi phạm vi sẽ không hoạt động.

scala> :pas 
// Entering paste mode (ctrl-D to finish) 

object scope { 
    implicit val x: String = { 
     import scope.{ x => _ } 
     implicitly[String] 
    } 
} 

// Exiting paste mode, now interpreting. 

defined object scope 

scala> scope.x 
res0: String = null 

Có cách nào thanh lịch hơn để đạt được bộ nhớ cache có độ phân giải ngầm không?

+1

@Taig Bạn đã xem macro 'cachedImplicit' của Shapeless? Nó [rất giống] (https://github.com/milessabin/shapeless/blob/dee18017c0c0284cde270948a16382ffc1f41273/core/src/main/scala/shapeless/package.scala#L126) với những gì bạn đang làm. –

+0

@TravisBrown đó là * chính xác * những gì tôi đã tìm kiếm (và bí mật hy vọng) cho. Tôi đã không gặp vấn đề với các truy vấn Google của tôi. Nếu bạn di chuyển nhận xét của mình thành câu trả lời, tôi sẽ rất vui khi được chấp nhận. – Taig

Trả lời

9

Shapeless cung cấp macro cachedImplicit với an implementation rất giống với của bạn (nó sử dụng bóng để tránh đệ quy và thực tế là macro có nghĩa là việc sử dụng có thể sạch hơn).

some limitations để nhận thức và bạn có thể không muốn phụ thuộc vào phương pháp duy nhất này, nhưng việc triển khai khá súc tích và ít nhất là điểm khởi đầu tốt.

3

Chỉ vì mục đích hoàn chỉnh: macro không hoạt hình trong câu trả lời được chấp nhận đổ bóng định nghĩa của riêng nó theo cách tôi không nghĩ ra. Do đó, vấn đề cụ thể của tôi có thể được giải quyết theo cách này:

implicit val x: String = { 
    def x = ??? 
    implicitly[String] 
} 
Các vấn đề liên quan