2009-10-05 15 views
12

नोटिस: स्कैला 2.11, NotNull के रूप में बहिष्कृत किया गया है।स्कैला की नॉटनुल विशेषता के लिए लाइब्रेरी समर्थन

जहां तक ​​मैं समझता हूं, यदि आप संदर्भ प्रकार को गैर-शून्य करने के लिए चाहते हैं तो आपको जादू NotNull विशेषता को मिश्रित करना होगा, और संकलक स्वचालित रूप से आपको null -able मानों को रखने से रोक देगा। उदाहरण के लिए यह mailing-list thread देखें।

गैर-शून्य प्रकारों के लिए एक सभ्य लाइब्रेरी समर्थन क्या कमी है। अगर मैं एक पैकेज लिखना चाहता हूं जिसे जावा कोड को सीधे इंटरफ़ेस करने की आवश्यकता नहीं है, और मैं डिफ़ॉल्ट रूप से null का उपयोग करने से इस पैकेज में सभी प्रकारों को रोकना चाहता हूं, तो मेरे पास

जैसे सभी बुलेटिंग चर को फिर से परिभाषित करने के अलावा कोई विकल्प नहीं है
//can't actually do that, but just to give the general idea 
class NString extends String with NotNull 
class NMap[X,Y] extends Map[X,Y] with NotNull 
... 

मैं स्केला विकल्प (एक संकलक प्लगइन, या पुस्तकालय के रूप में) के लिए मुझे आदेश आसानी से एक विशिष्ट स्केला फ़ाइल में null उपयोग की अनुमति रद्द करने में

import collections.notnull._ 

लिखने के लिए उम्मीद है।

क्या मानक पुस्तकालय में कई उपयोगी प्रकारों को आसानी से बल देने के लिए कोई विकल्प नहीं है?

+1

आप स्ट्रिंग का विस्तार कर सकते हैं? मैंने सोचा कि यह अंतिम चिह्नित किया गया था। –

+0

वास्तव में आप नहीं कर सकते हैं। अच्छी बात। मुझे लगता है कि स्ट्रिंग के लिए निहित रूपांतरण के साथ एनस्ट्रिंग को परिभाषित करने की आवश्यकता है। –

+1

मुझे लगता है कि आप 'org.jetbrains.annotations.NotNull' जैसे कुछ ढूंढते हैं - और मुझे वह भी याद आती है। – Martin

उत्तर

9

मुझे वास्तव में पता नहीं है कि सौदा NotNull के साथ क्या है, लेकिन मुझे यह धारणा मिलती है कि स्कैला ने पूरी तरह से काम नहीं किया है कि यह नॉटनुल/न्यूबल योग्य अवधारणाओं से कैसे निपटना चाहता है। मेरी अपनी नीति स्काला में कभी भी शून्य का उपयोग नहीं करना है, और यदि आप जावा एपीआई को कॉल करते हैं जो शून्य, तुरंत को Option में परिवर्तित कर सकता है।

def ?[A <: AnyRef](nullable: A): Option[A] = if (nullable eq null) None else Some(nullable) 

तो फिर तुम इस तरह सामान करना:

val foo: Option[Foo] = ?(getFooFromJavaAPIThatMightReturnNull()) 

मैं इतनी दूर ट्रैक करने के लिए या नल नहीं भी हो सकती है क्या कोशिश कर रहा से सरल लगता है

यह उपयोगिता विधि मेरे सबसे अच्छे दोस्त है।

तो मैं आपके सवाल का जवाब देने के बिल्कुल नहीं किया, लेकिन मैं यह उपयोगी है मामले में यह पारित ...

अद्यतन: अधिक हाल ही में स्काला संस्करणों अब मानक एपीआई में इस समर्थन करते हैं:

val foo: Option[Foo] = Option(getFooFromJavaAPIThatMightReturnNull()) 
+1

आपके दृष्टिकोण के साथ समस्या यह है कि टाइप सिस्टम मुझे शून्य का उपयोग न करने के लिए मजबूर नहीं करता है। इसलिए मैं एक जावा एपीआई कॉल भूल सकता हूं, और बिना किसी ध्यान के मेरे कोड में एक शून्य से छीन रहा हूं। यदि ओटीओएच सभी प्रकारों को अनुपयोगी नहीं है, तो संकलक चिल्लाएगा यदि आपने वैल एक्स किया था: NotNullable = javaapithatmightreturnNull() के साथ स्ट्रिंग। –

+5

'Option.apply' वही चीजें करता है जैसे आपका '?' फ़ंक्शन। – schmmd

+2

दरअसल, लेकिन यह विकल्प से पहले लिखा गया था। वास्तव में मौजूद था। – Lachlan

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