असंगत प्रकार: int को बूलियन में नहीं बदला जा सकता है
मुझे इसमें दिलचस्पी है कि C इसे अनुमति क्यों देता है और जावा नहीं। इसलिए, मुझे भाषा के प्रकार प्रणाली में दिलचस्पी है, विशेष रूप से इसकी मजबूती।
आपके प्रश्न के दो भाग हैं:
जावा में परिवर्तित क्यों नहीं होता intहै boolean?
यह जावा के लिए नीचे फोड़ा जा रहा है जितना संभव हो उतना स्पष्ट होने का इरादा है। यह बहुत स्थिर है, बहुत "अपने चेहरे में" इसके प्रकार प्रणाली के साथ। अन्य भाषाओं में स्वचालित रूप से टाइप की जाने वाली चीजें जावा में नहीं हैं। आपको भी लिखना है int a=(int)0.5। जानकारी खोने के floatलिए परिवर्तित intकरना; के रूप में परिवर्तित intकरने booleanऔर इस तरह त्रुटि-प्रवण होगा। इसके अलावा, उन्हें बहुत सारे संयोजन निर्दिष्ट करने होंगे। निश्चित रूप से, ये बातें स्पष्ट प्रतीत होती हैं, लेकिन वे सावधानी के साथ पीछे हटने का इरादा रखते हैं।
ओह, और अन्य भाषाओं की तुलना में, जावा अपने विनिर्देश में बहुत सटीक था , क्योंकि बायटेकोड केवल आंतरिक कार्यान्वयन विवरण नहीं था। उन्हें किसी भी और सभी इंटरैक्शन को निर्दिष्ट करना होगा, ठीक है। बहुत बड़ा उपक्रम।
के ifअलावा अन्य प्रकारों को स्वीकार क्यों नहीं करता है boolean?
ifअन्य प्रकार की अनुमति देने के लिए पूरी तरह से अच्छी तरह से परिभाषित किया जा सकता है boolean। इसकी एक परिभाषा हो सकती है जो कहती है कि निम्नलिखित समतुल्य हैं:
true
int != 0
String साथ में .length>0
- कोई भी अन्य वस्तु संदर्भ जो गैर है
null(और Booleanमूल्य के साथ नहीं false)।
- या यहां तक कि: कोई भी अन्य वस्तु संदर्भ जो गैर है-
nullऔर जिसकी विधि Object.check_if(मेरे द्वारा इस अवसर के लिए आविष्कार की गई) वापस आती है true।
उन्होंने नहीं किया; इसकी कोई वास्तविक आवश्यकता नहीं थी, और वे इसे यथासंभव मजबूत, स्थिर, पारदर्शी, आसानी से पढ़ना आदि चाहते थे। कोई निहित विशेषताएं नहीं। इसके अलावा, कार्यान्वयन बहुत जटिल होगा, मुझे यकीन है, सभी संभावित मामलों के लिए प्रत्येक मूल्य का परीक्षण करने के लिए, इसलिए प्रदर्शन ने केवल एक छोटा कारक खेला हो सकता है (जावा उस दिन के कंप्यूटरों पर स्लो किया जाता था; याद रखें पहले रिलीज के साथ कोई जेआईटी संकलक नहीं था, कम से कम उन कंप्यूटरों पर नहीं जिन्हें मैंने इस्तेमाल किया था)।
गहरा कारण
एक गहरा कारण यह तथ्य भी हो सकता है कि जावा के आदिम प्रकार हैं, इसलिए इसकी प्रकार प्रणाली वस्तुओं और आदिम के बीच फटी हुई है। हो सकता है, अगर वे उन लोगों से बचते, तो चीजें दूसरी तरह से बदल जातीं। पिछले अनुभाग में दिए गए नियमों के साथ, उन्हें प्रत्येक एकल आदिम की सत्यता को स्पष्ट रूप से परिभाषित करना होगा (क्योंकि आदिम एक सुपर क्लास साझा नहीं करते हैं, और nullआदिम के लिए अच्छी तरह से परिभाषित नहीं है )। यह एक दुःस्वप्न में बदल जाएगा, जल्दी से।
आउटलुक
खैर, और अंत में, शायद यह भाषा डिजाइनरों की एक प्राथमिकता है। प्रत्येक भाषा को अपने तरीके से स्पिन करने लगता है ...
उदाहरण के लिए, रूबी का कोई आदिम प्रकार नहीं है। सब कुछ, वस्तुतः सब कुछ, एक वस्तु है। उनके पास यह सुनिश्चित करने का बहुत आसान समय है कि प्रत्येक वस्तु की एक निश्चित विधि है।
रूबी सभी प्रकार की वस्तुओं पर सत्यता की तलाश करती है जिसे आप इसे फेंक सकते हैं। दिलचस्प रूप से पर्याप्त है, इसका अभी भी कोई booleanप्रकार नहीं है (क्योंकि इसमें कोई आदिम नहीं है), और इसका कोई Booleanवर्ग भी नहीं है। यदि आप पूछते हैं कि किस वर्ग का मूल्य true(हाथ से उपलब्ध है true.class), तो आपको मिलता है TrueClass। उस वर्ग के पास वास्तव में विधियाँ हैं, अर्थात् बूलियन्स के लिए 4 संचालक ( | & ^ ==)। यहाँ, ifइसके मान को गलत मानते हैं यदि और केवल ( falseया रूबी में से)। बाकी सब सच है। तो, या दोनों सच हैं।nilnull0""
यह उनके लिए एक ऐसा तरीका बनाने के लिए तुच्छ होगा Object#truthy?जो किसी भी वर्ग के लिए लागू किया जा सकता है और एक व्यक्तिगत सच्चाई लौटा सकता है। उदाहरण के लिए, String#truthy?गैर-रिक्त स्ट्रिंग्स या व्हाट्सएप के लिए सही होने के लिए लागू किया जा सकता था। हालांकि, ज्यादातर विभागों में रूबी जावा का विरोधी है (मिक्सिन के साथ गतिशील बतख-टाइपिंग, फिर से खोलने वाली कक्षाएं और वह सब)।
जो एक पर्ल प्रोग्रामर के लिए आश्चर्य की बात हो सकती है, जो $value <> 0 || length($value)>0 || defined($value)सच्चाई होने के लिए उपयोग किया जाता है । और इसी तरह।
एसक्यूएल को इस कन्वेंशन के साथ दर्ज करें कि nullकिसी भी अभिव्यक्ति के अंदर यह स्वचालित रूप से गलत है, चाहे जो भी हो। तो (null==null) = false। रूबी में, (nil==nil) = true। अच्छा समय।