2012-11-23 3 views
5

Aşağıdaki kodu düşünün. Tabii kiKesin Subimplicits

implicit val b: A = new B 

bu hatayı artıracaktır. Neden foo neden örtük'u seçer ve örtük a? Veya daha genel: Neyin seçileceğine dair kurallar neler?

DÜZENLEME: Ben açıklamak istiyorum
nedeniyle Ivan ile benim comment-konuşma için: Yerel örtülü Val kapalı yöntem parametresi olarak aynı şekilde adlandırılmış eğer Sorumun cevabını bilemez.

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

sonra sadece yerel val a aynı adı çünkü yöntem parametre alanı-geçersiz olduğu konular arasındadır.

+0

[Nerede Scala implicits için görünüyor?] Olası yinelenen (http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits) –

+0

Ayrıca bkz: http: // eed3si9n.com/implicit-parameter-precedence-again (bu sorudan bağlantılı). –

cevap

1

Not: Muhtemelen işleri çok fazla abartıyorum, ancak testte aşağıdaki gibi görünüyordu.

Çünkü, ikincisi iç bir kapsamda olduğundan, önceliği vardır. Bu durumda

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

ile olur Onun aynı şey işlevi içinde 6 olmak a beklenebilir. Aşağıdaki benzer.

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

Yorumdan güncellendi.

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

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

İlginç bir bakış açısı! scoping: evet, bununla ilgili olsa da, benim anlayışımda, metod parametreleri aynı yöntemde tanımlanan yerel vals/vars ile aynı kapsamdadır. Örnekleriniz onları kapsam dışı bıraktı. Sonra önceliği benim için çok açık. Şimdi merak ediyorum: Yöntem parametreleri yerel metot vals/vars ile aynı kapsamda değil midir yoksa scala'da implicits için özel bir tedavi midir? –

+0

Cevabımı güncelledim. Yerel vals, metod parametrelerine göre önceliklidir. –

+0

Gördüğünüz: yerel değerler, aynı ada sahip olduklarında (önemsiz) ve bu yerel örtütlere benzer olduğunda, her ikisi de aynı ada sahip olduğunda ve aynı ada sahip olduğunda, yöntem parametresi örtütlerine göre öncelikli olan, yöntem parametrelerine göre önceliklidir. –