2012-11-23 22 views
5

निम्नलिखित कोड पर विचार करें। बेशकसुस्पष्ट Subimplicits

implicit val b: A = new B 

उस त्रुटि को बढ़ाएगा। foo क्यों निहित b चुनें और निहित a नहीं? या इससे भी अधिक सामान्य: क्या नियम उठाए जाएंगे?

संपादित करें:
कारण इवान के साथ मेरी टिप्पणी-बातचीत करने के लिए मैं स्पष्ट करना चाहता हूँ: अगर मैं स्थानीय अंतर्निहित वैल निहित विधि पैरामीटर के रूप में एक ही तरह से नामित मैं अपने सवाल का जवाब पता होगा।

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

तो केवल स्थानीय val a जो विधि पैरामीटर गुंजाइश-ओवरराइड करता है, क्योंकि वे एक ही नाम है दायरे में है।

+0

की [कहाँ स्काला implicits के लिए दिखता है?] संभव डुप्लिकेट (http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits) –

+0

भी देखें http: // eed3si9n.com/implicit-parameter-precedence-again (उस प्रश्न से जुड़ा हुआ)। –

उत्तर

1

नोट: मैं शायद चीजों को अत्यधिक बढ़ा रहा हूं, लेकिन परीक्षण में यह निम्न जैसा प्रतीत होता है।

ऐसा इसलिए है क्योंकि दूसरा एक आंतरिक दायरे में है, इसलिए इसकी प्राथमिकता है। इसका एक ही बात है कि

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

के साथ होता है इस मामले में आप a उम्मीद समारोह के अंदर 6 होगा। निम्नलिखित समान है।

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

टिप्पणी से अपडेट किया गया।

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

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

दिलचस्प दृष्टिकोण! स्कोपिंग: हाँ, मैं इसके बारे में हालांकि, लेकिन मेरी समझ में विधि पैरामीटर एक ही दायरे में हैं जैसे स्थानीय vals/vars एक ही विधि में परिभाषित किया गया है। आपके उदाहरणों ने उन्हें दायरे से बाहर रखा है। तब प्राथमिकता मेरे लिए बहुत स्पष्ट है। अब मैं उत्सुक हूं: क्या विधि पैरामीटर स्थानीय विधि vals/vars के समान क्षेत्र में नहीं हैं या क्या यह स्कैला में प्रत्यारोपण के लिए एक विशेष उपचार है? –

+0

मैंने अपना जवाब अपडेट किया। स्थानीय vals विधि पैरामीटर पर precendence लेते हैं। –

+0

मैं देखता हूं: स्थानीय वैल विधि मानकों पर प्राथमिकता लेते हैं जब उनके पास एक ही नाम (छोटा) होता है और उस स्थानीय प्रत्यारोपण के समान होते हैं, जब वे दोनों फिट होते हैं और एक ही नाम होते हैं तो विधि पैरामीटर इम्प्लिकेट्स पर प्राथमिकता लेते हैं। –