2012-11-24 15 views
5

विशेषता (सरलीकृत)स्कैला :: आलसी मूल्य मुद्रित होने तक शून्य है?

trait A { 
    val eventStream: EventStream 
    val credentialsStorage = // something here 
    val userStorage = // something here 
    val crypto = // something here 
    ...  
    lazy val authSvc = new CoreAuthentication(credentialsStorage, new AuthenticationProviderResolver, userStorage, eventStream, crypto) 
} 

class T extends A with TraitProvidingEventStream with FlatSpec with [lot of another traits here] { 

    val eventStream = systemFromTraitProvidingEventStream.eventStream 

    "This" should "work" in { 
    println(authSvc) // this is "magic" 
    val user = authSvc.doSomethingWithUser(...); 
    } 
} 

अगर मैं हटाने लाइन के रूप में चिह्नित देखते हुए // इस "जादू", तो मैं, अगली पंक्ति पर NullPointerException मिल जाएगा तो authSvc अशक्त है।

क्या गलत हो सकता है?

मैं नहीं है कि के लिए स्वच्छ छोटे से परीक्षण मामले बनाने में सक्षम हो, आम तौर पर यह अच्छी तरह से काम करता है किया गया था

+1

क्या आप सुनिश्चित हैं कि 'authSvc' तक पहुंच एनपीई फेंकता है और विधि 'doSomethingWithUser' या इसके पैरामीटर नहीं है? – sschaef

+0

बिल्कुल, भले ही यह एनपीई को कहीं अंदर डालेगा कुछ ऐसा विथ यूज़र - तब प्रिंटल के पास इसके बारे में कुछ भी नहीं है। – jdevelop

+0

मैं इसे डीबग करना चाहता हूं, लेकिन यह सुनिश्चित नहीं करता कि कैसे। किसी भी तरह की सहायता को आभार समझेंगे। – jdevelop

उत्तर

4

इस एमएल पर एक बार आया था: अगर एक अपवाद है जब एक आलसी वैल आरंभ फेंक दिया जाता है, वैल रिक्त है ; लेकिन आप फिर से init करने का प्रयास कर सकते हैं और यह जादुई रूप से काम कर सकते हैं। (यानी, आलसी वैल के लिए "प्रारंभिक" बिट झंडा प्रारंभ करने के पहले असफल प्रयास पर सेट नहीं है।)

मुझे लगता है कि एमएल पर मामले को लक्षणों में vals के init आदेश के साथ करना था, तो शायद यह तुम्हारी समस्या है। इस पर भरोसा करना बेहद खतरनाक है, इसलिए लक्षणों में defs का उपयोग करने की सलाह। DelayedInit पर लुइगी की टिप्पणी देखें।

संबंधित मुद्दे