2012-03-07 26 views
6

Đây là cách đơn giản hóa những gì tôi gặp phải. Đây biên dịch:Ngụ ý và lệnh khai báo

trait A { implicit val x = 1 } 
trait B extends A { val y = implicitly[Int] } 

Trong khi điều này không (không thể tìm thấy giá trị tiềm ẩn):

trait B extends A { val y = implicitly[Int] } 
trait A { implicit val x = 1 } 

tôi đã cố gắng để làm cho ý định của tôi rõ ràng bằng cách xác định một tự loại: trait A { this: B => ... }, nhưng không có kết quả .

Làm cách nào để giải quyết loại phụ thuộc này mà không phải lo lắng về cách mã của tôi được đặt ra?

Trả lời

11

Bạn cần phải khai báo kiểu một cách rõ ràng, ít nhất là cho sau này một

trait B extends A { val y = implicitly[Int] } 
trait A { implicit val x : Int = 1 } 

Các quy tắc cho tầm nhìn tuyệt đối là khác nhau cho dù loại của nó được khai báo explicitely hay không. Nếu nó không phải là, tiềm ẩn có sẵn (như là một tiềm ẩn) chỉ sau thời điểm khai báo.

Lý do là suy luận kiểu có thể trở nên quá khó nếu loại không được khai báo (như trong quy trình đệ quy). Trong nhiều trường hợp, suy luận sẽ dễ dàng (như trong mã của bạn) nhưng thông số kỹ thuật phải được cắt rõ ràng.

+0

Điều gì về các đối tượng tiềm ẩn? Bạn có thể chỉ cho tôi các phần của thông số kỹ thuật liên quan đến độ phân giải của implicits? 'đặc điểm X; đặc điểm B mở rộng A {val y = ngầm [X]}; trait A {đối tượng ẩn x mở rộng X} ' – elbowich

+1

Xin lỗi vì câu trả lời trễ. Sau một cái nhìn cursory hơn trong spec, tôi không thể tìm thấy các quy tắc. Tuy nhiên, nó được nhắc đến trong [báo cáo lỗi này] (https://issues.scala-lang.org/browse/SI-801), có vẻ như đó là những gì thực hiện, nhưng nó vẫn chưa được đưa ra cho spec. Tôi không hiểu tại sao nó không nên làm việc với một đối tượng tiềm ẩn. –

Các vấn đề liên quan