असंगत प्रकार: 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
या रूबी में से)। बाकी सब सच है। तो, या दोनों सच हैं।nil
null
0
""
यह उनके लिए एक ऐसा तरीका बनाने के लिए तुच्छ होगा Object#truthy?
जो किसी भी वर्ग के लिए लागू किया जा सकता है और एक व्यक्तिगत सच्चाई लौटा सकता है। उदाहरण के लिए, String#truthy?
गैर-रिक्त स्ट्रिंग्स या व्हाट्सएप के लिए सही होने के लिए लागू किया जा सकता था। हालांकि, ज्यादातर विभागों में रूबी जावा का विरोधी है (मिक्सिन के साथ गतिशील बतख-टाइपिंग, फिर से खोलने वाली कक्षाएं और वह सब)।
जो एक पर्ल प्रोग्रामर के लिए आश्चर्य की बात हो सकती है, जो $value <> 0 || length($value)>0 || defined($value)
सच्चाई होने के लिए उपयोग किया जाता है । और इसी तरह।
एसक्यूएल को इस कन्वेंशन के साथ दर्ज करें कि null
किसी भी अभिव्यक्ति के अंदर यह स्वचालित रूप से गलत है, चाहे जो भी हो। तो (null==null) = false
। रूबी में, (nil==nil) = true
। अच्छा समय।