Để 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?
@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. –
@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