2016-01-27 6 views
5

के अंदर अनसुलझा संदर्भ मेरे पास नीचे दिया गया कोड है। यह कोटलिन है। textToSpeech.setLanguage(Locale.UK) से textToSpeech कोई विचार क्यों है कि textToSpeech के लिए कोई संदर्भ हल नहीं किया गया है?अनाम कोटलिन श्रोता

val textToSpeech = TextToSpeech(
      applicationContext, 
      object : TextToSpeech.OnInitListener { 
       override fun onInit(status: Int) { 
        if (status == TextToSpeech.SUCCESS) { 
         textToSpeech.setLanguage(Locale.UK) 
        } 
       } 

      }) 

पहले तो मुझे यह प्लगइन बग kotlin एक विचार है मान लिया, लेकिन ऐसा लगता है कि यह वास्तव संकलित नहीं किया जा सकता

उत्तर

7

Kotlin चर प्रारंभ नीति कठोर है, और यह अब चर संदर्भ के लिए निषिद्ध है अपने प्रारंभिक यंत्र के अंदर, यहां तक ​​कि लैम्ब्डा और ऑब्जेक्ट एक्सप्रेशन में भी, जो उचित लगता है: कल्पना करें कि परिवर्तनीय असाइनमेंट से पहले लैम्ब्डा को तुरंत बुलाया जाता है।

अपने मामले के लिए, मैं यह काफी बोझिल निर्माण में एक object expression का उपयोग कर एक समाधान के रूप का सुझाव कर सकते हैं:

val textToSpeech = object { 
    val value: TextToSpeech get() = inner 
    private val inner = TextToSpeech(
      applicationContext, 
      { value.setLanguage(Locale.UK) } 
    ) 
}.value 

यह inner साथ एक अनाम वस्तु प्रारंभ हो जाएगा अंदर कि value संपत्ति के माध्यम से स्वीकार्य है। ध्यान दें कि inner प्रारंभकर्ता value संपत्ति का उपयोग करता है। फिर value निकाला जाता है और इसका उपयोग किया जा सकता है।

लेकिन कृपया ध्यान रखें कि इस चाल असुरक्षित है: पहले inner असाइन किया गया है, क्रम में value का उपयोग कर (जैसे TextToSpeech निर्माता में) NullPointerException फेंक देते हैं।

इसके अलावा, मैंने OnInitListener को SAM conversion का उपयोग करके लैम्ब्डा के साथ छोटा करने के लिए प्रतिस्थापित किया है, लेकिन ऑब्जेक्ट अभिव्यक्ति का अभी भी उपयोग किया जा सकता है।


यूपीडी: इस दृष्टिकोण को सामान्य बनाने के मेरे प्रयास के लिए this question देखें। इसका उपयोग करके, आप

val textToSpeech = selfReference { 
    TextToSpeech(
     applicationContext, 
     { self.setLanguage(Locale.UK) } 
    ) 
} 

sources on Github देखें।