2012-11-23 4 views
5

Xét đoạn mã sau:Subimplicits rõ ràng

class A { def print = println("A") } 
class B extends A { override def print = println("B") } 

def foo(implicit a: A) = a.print 

def bar(implicit a: A) = { 
    implicit val b = new B 
    foo 
} 

bar(new A) // B 

Tôi tự hỏi tại sao gọi foo trong bar không được nâng cao một lỗi ambiguous implicit values. Tất nhiên

implicit val b: A = new B 

sẽ tăng lỗi đó. Tại sao foo chọn ngụ ý b và không ngụ ý a tiềm ẩn? Hoặc thậm chí tổng quát hơn: Các quy tắc sẽ được chọn là gì?

EDIT:
Do tôi comment-trò chuyện với Ivan Tôi muốn làm rõ: Tôi sẽ biết câu trả lời cho câu hỏi của tôi nếu tôi đặt tên cho địa phương tiềm ẩn val cách tương tự như tham số phương pháp ngầm.

def bar(implicit a: A) = { 
    implicit val a = new B 
    foo 
} 

Chỉ phạm vi địa phương ghi đè tham số phương thức vì chúng có cùng tên.

+0

thể trùng lặp của [đâu Scala tìm kiếm implicits?] (Http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits) –

+0

Xem thêm http: // eed3si9n.com/implicit-parameter-precedence-again (được liên kết từ câu hỏi đó). –

Trả lời

1

Lưu ý: Tôi có thể là những thứ quá tải, nhưng trong thử nghiệm nó có vẻ như sau.

Đó là vì thứ hai nằm trong phạm vi bên trong nên nó được ưu tiên. Điều tương tự của nó xảy ra với

object test { 
val a = 5 
def test(i: Int) = { 
    val a = 6 
    i + a 
} 
} 

Trong trường hợp này, bạn mong đợi a là 6 bên trong hàm. Sau đây là tương tự.

object test { 
    implicit val i = 5; 
    { 
    implicit val b = 6; 
    test 
    } 
    def test(implicit ii:Int) = println(ii) 
} 

Được cập nhật từ nhận xét.

scala> def test(a: Int) = {val a = 5; a } 
test: (a: Int)Int 

scala> test(6) 
res1: Int = 5 
+0

Quan điểm thú vị! phạm vi: có, tôi mặc dù về nó, nhưng trong các thông số phương pháp hiểu biết của tôi là trong phạm vi tương tự như vals địa phương/vars được định nghĩa trong cùng một phương pháp. Ví dụ của bạn đặt chúng ra khỏi phạm vi. Sau đó ưu tiên là rất rõ ràng với tôi. Bây giờ tôi tò mò: Là các tham số phương pháp không trong phạm vi tương tự như phương pháp địa phương vals/vars hoặc nó là một điều trị đặc biệt cho implicits trong scala? –

+0

Tôi đã cập nhật câu trả lời của mình. các vals cục bộ có quyền ưu tiên hơn các tham số phương thức. –

+0

Tôi thấy: các vals cục bộ được ưu tiên hơn các tham số phương thức khi chúng có cùng tên (tầm thường) và tương tự với các hàm địa phương được ưu tiên so với tham số phương thức khi chúng vừa và có cùng tên. –