खोपड़ी में अशक्त / कुछ भी नहीं / यूनिट के Usages


95

मैंने अभी-अभी पढ़ा है: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/

जहाँ तक मैं समझता हूँ, Nullएक लक्षण है और इसका एकमात्र उदाहरण है null

जब कोई विधि अशक्त तर्क लेती है, तो हम इसे केवल एक Nullसंदर्भ या nullसीधे पास कर सकते हैं, लेकिन कोई अन्य संदर्भ नहीं, भले ही यह अशक्त हो ( nullString: String = nullउदाहरण के लिए)।

मुझे आश्चर्य है कि इस Nullविशेषता का उपयोग करने वाले कौन से मामले उपयोगी हो सकते हैं। कुछ भी नहीं है, जिसके लिए मैं वास्तव में कोई और उदाहरण नहीं देखता।


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


क्या आपके पास यूनिट / नल / कुछ भी नहीं है जो रिटर्न प्रकार के अलावा कुछ और है?

जवाबों:


80

आप केवल कुछ नहीं का उपयोग करते हैं यदि विधि कभी नहीं लौटती है (इसका अर्थ है कि यह सामान्य रूप से वापस लौटने से पूरा नहीं हो सकता है, यह एक अपवाद फेंक सकता है)। कुछ भी कभी भी त्वरित नहीं होता है और टाइप सिस्टम के लाभ के लिए होता है (जेम्स आइरी को उद्धृत करने के लिए: "कारण स्कैला में एक निचला प्रकार टाइप मापदंडों में भिन्नता व्यक्त करने की क्षमता से बंधा हुआ है" )। आपके द्वारा जुड़े लेख से:

नथिंग का एक अन्य उपयोग उन तरीकों के लिए एक वापसी प्रकार है जो कभी नहीं लौटते हैं। यह अर्थपूर्ण है यदि आप सोचें इसके बारे में। यदि किसी विधि का रिटर्न प्रकार कुछ भी नहीं है, और कुछ भी नहीं की पूरी तरह से मौजूद है, तो ऐसी विधि कभी भी वापस नहीं होनी चाहिए।

आपकी लॉगिंग विधि इकाई वापस कर देगी। एक मूल्य इकाई है इसलिए इसे वास्तव में वापस किया जा सकता है। से एपीआई डॉक्स :

यूनिट scala.AnyVal का एक उपप्रकार है। टाइप यूनिट () का केवल एक मान है, और यह अंतर्निहित रनटाइम सिस्टम में किसी भी ऑब्जेक्ट द्वारा दर्शाया नहीं गया है। रिटर्न टाइप यूनिट के साथ एक विधि जावा विधि के अनुरूप होती है जिसे शून्य घोषित किया जाता है।


2
धन्यवाद, "कभी नहीं लौटता" से क्या आपका मतलब है कि कॉल अनिश्चित काल के लिए अवरुद्ध है (नौकरी अनुसूचक के स्टार्टअप विधि को छूट देने के लिए?)
सेबस्टियन लॉबर

3
@ सबस्टियन: यह सामान्य रूप से वापस नहीं आता है, यह एक अपवाद फेंक सकता है (देखें james-iry.blogspot.com/2009/08/… )। यदि अवरोधक कॉल केवल एक अपवाद को फेंकने के साथ समाप्त होता है तो वह गणना करेगा। सवाल के लिए धन्यवाद, यह स्पष्ट करने की जरूरत है।
नाथन ह्यूजेस

18

आपके द्वारा उद्धृत लेख भ्रामक हो सकता है। Nullप्रकार के साथ संगतता के लिए नहीं है जावा आभासी मशीन , और विशेष रूप से जावा।

हमें विचार करना चाहिए कि स्काला :

  • पूरी तरह से वस्तु उन्मुख है: प्रत्येक मूल्य एक वस्तु है
  • दृढ़ता से टाइप किया गया है: प्रत्येक मान में एक प्रकार होना चाहिए
  • nullउदाहरण के लिए, जावा पुस्तकालयों और कोड तक पहुँच के संदर्भों को संभालने की जरूरत है

इस प्रकार nullमूल्य के लिए एक प्रकार को परिभाषित करना आवश्यक हो जाता है , जो Nullविशेषता है, और हैnull इसका एकमात्र उदाहरण है।

Nullप्रकार में कुछ भी उपयोगी नहीं है जब तक कि आप टाइप-सिस्टम नहीं हैं या आप कंपाइलर पर विकसित कर रहे हैं। विशेष रूप से, मैं किसी Nullविधि के लिए एक प्रकार के पैरामीटर को परिभाषित करने के लिए कोई समझदार कारण नहीं देख सकता , क्योंकि आप कुछ भी नहीं पारित कर सकते हैंnull


यह सच है, इसलिए अंत में नल का कोई अन्य उपयोग नहीं है?
सेबेस्टियन लॉबर

@SebastienLorber ने उत्तर संपादित किया। मैं वास्तव में औसत डेवलपर के लिए कोई उपयोग नहीं देख सकता। हो सकता है कि कोई और कुछ उपयोगी सोच सकता है।
शिवालय_5

इसके लिए धन्यवाद। अगर हम इस तरह की चीजों का कारण जानते हैं, तो हम उन्हें समझते हैं, अन्यथा हम उन्हें याद करते हैं।
श्रीकर

नल उपयोगी होता है जब आपके पास एक प्रकार का पैरामीटर होता है और आप इस प्रश्न और उत्तर की तरह अशक्त वापस आ सकते हैं , क्योंकि आपके द्वारा कुल्ला में नल का उपयोग करने से हतोत्साहित होने के बावजूद यह शायद ही कभी आता है, साथ ही साथ टाइप सिस्टम में अन्य उपयोग भी हो सकते हैं
डैनियल कार्लसन

15

क्या आपके पास यूनिट / नल / कुछ भी नहीं है जो रिटर्न प्रकार के अलावा कुछ और है?


Unit इस तरह इस्तेमाल किया जा सकता है:

def execute(code: => Unit):Unit = {
  // do something before
  code
  // do something after
}

यह आपको कोड के एक अनियंत्रित ब्लॉक में पारित करने की अनुमति देता है।


Nullकिसी भी मूल्य के लिए नीचे प्रकार के रूप में इस्तेमाल किया जा सकता है जो कि अशक्त है। एक उदाहरण यह है:

implicit def zeroNull[B >: Null] =
    new Zero[B] { def apply = null }

Nothing की परिभाषा में प्रयोग किया जाता है None

object None extends Option[Nothing]

यह आपको Noneकिसी भी प्रकार का असाइन करने की अनुमति देता है Optionक्योंकि Nothing'सब कुछ' का विस्तार करता है।

val x:Option[String] = None

ठीक। यूनिट के आपके उपयोग के लिए आप एक जेनेरिक प्रकार का उपयोग कर सकते थे ताकि एग्जिक्यूट इस जेनेरिक प्रकार को वापस कर सके यदि आपका कोड ब्लॉक यूनिट के अलावा कुछ और देता है।
सेबेस्टियन लॉर्बर

जैसा कि @drexin ने एक अन्य उत्तर पर एक टिप्पणी में कहा, इसका उपयोग ज्यादातर साइड इफेक्ट को दर्शाने के लिए किया जाता है।
EECOLOR

6

यदि आप उपयोग करते हैं Nothing, तो कुछ करने के लिए कोई चीज़ नहीं है (प्रिंट कंसोल शामिल करें) यदि आप कुछ करते हैं, तो आउटपुट प्रकार का उपयोग करेंUnit

object Run extends App {
  //def sayHello(): Nothing = println("hello?")
  def sayHello(): Unit = println("hello?")
  sayHello()
}

... तो उपयोग कैसे करें Nothing?

trait Option[E]
case class Some[E](value: E) extends Option[E]
case object None extends Option[Nothing]

1
इसके अलावा, Eमें Optioncovariant स्थिति में हो गया है: trait Option[+E]अनुमति देने के लिए तरह बातेंval x: Option[Int] = None
vim

5

मैंने वास्तव में कभी भी Nullप्रकार का उपयोग नहीं किया है , लेकिन आप उपयोग करते हैं Unit, जहां आप जावा का उपयोग करेंगे voidNothingएक विशेष प्रकार है, क्योंकि जैसा कि नातान ने पहले ही उल्लेख किया है, कोई उदाहरण नहीं हो सकता है NothingNothingएक तथाकथित नीचे-प्रकार है, जिसका अर्थ है, कि यह किसी अन्य प्रकार का एक उप-प्रकार है। यह (और contravariant प्रकार पैरामीटर) यही कारण है कि आप किसी भी मान को प्रीपे कर सकते हैं Nil- जो कि एक है List[Nothing]- और सूची तब इस प्रकार के तत्वों की होगी। Noneअगर टाइप का भी Option[Nothing]। ऐसे कंटेनर के अंदर मूल्यों तक पहुंचने का हर प्रयास एक अपवाद को फेंक देगा, क्योंकि यह केवल विधि के प्रकार से लौटने का एकमात्र वैध तरीका है Nothing


धन्यवाद मुझे नहीं पता था कि कोई भी विकल्प नहीं बढ़ाता [कुछ भी नहीं]। यह कुछ जेनरिक उपयोगों में समझ में आता है, जहां एक उपप्रकार कुछ भी नहीं इस्तेमाल कर सकता है (मुझे लगता है कि यह नल और यूनिट के लिए एक छूट खोजने के लिए कठिन है ...)
सेबस्टियन लॉबर

यूनिट का उपयोग किया जाता है, जहां साइड इफेक्ट्स होते हैं, उदाहरण के लिए आईओ मोनाड IO[Unit]कंसोल और इस तरह मुद्रण के लिए प्रकार का हो सकता है ।
drexin

हां, कभी भी IO मोनड का उपयोग नहीं किया गया है जो इसे यूनिट के साथ उपयोग करने के लिए समझ में आता है (और शायद कुछ भी नहीं अगर यह कुछ IO ऑपरेशन है जो एक अनंत धारा का उत्पादन करता है?)
सेबस्टियन लॉबर

नहीं, नथिंग नो का कोई मतलब नहीं है।
drexin

3

कुछ भी अक्सर अंतर्निहित रूप से उपयोग नहीं किया जाता है। नीचे दिए गए कोड में, किसी और खंड प्रकार का है कुछ भी नहीं है, जो बूलियन का एक उपवर्ग (और साथ ही किसी भी अन्य AnyVal) है। इस प्रकार, पूरा असाइनमेंट कंपाइलर के लिए मान्य है, हालांकि अन्य क्लॉज वास्तव में कुछ भी वापस नहीं करता है।val b: Boolean = if (1 > 2) false else throw new RuntimeException("error")


1

यहाँ का एक उदाहरण है Nothingसे scala.predef:

  def ??? : Nothing = throw new NotImplementedError

यदि आप अपरिचित हैं (और खोज इंजन उस पर खोज नहीं कर सकते हैं) ???तो किसी भी चीज के लिए स्काला का प्लेसहोल्डर फ़ंक्शन है जिसे अभी तक लागू नहीं किया गया है। जैसे कोटलीन काTODO

नकली वस्तुओं को बनाते समय आप एक ही चाल का उपयोग कर सकते हैं: एक कस्टम notUsedविधि के साथ अप्रयुक्त विधियों को ओवरराइड करें । उपयोग नहीं करने का लाभ यह ???है कि आपको उन चीजों के लिए संकलन चेतावनी नहीं मिलेगी जिन्हें आप कभी भी लागू नहीं करना चाहते हैं।


0

श्रेणी सिद्धांत के संदर्भ में कुछ भी एक प्रारंभिक वस्तु नहीं है और यूनिट एक टर्मिनल ऑब्जेक्ट है

https://en.wikipedia.org/wiki/Initial_and_terminal_objects

प्रारंभिक वस्तुएं को कोटिर्मल या यूनिवर्सल भी कहा जाता है , और टर्मिनल ऑब्जेक्ट को अंतिम भी कहा जाता है ।

यदि कोई ऑब्जेक्ट प्रारंभिक और टर्मिनल दोनों है , तो इसे ए कहा जाता है शून्य वस्तु या अशक्त वस्तु।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.