कोई अंतर्निहित रूपांतरण क्यों नहीं हो सकता है?


14

जैसा कि मैं इसे समझता हूं, अंतर्निहित रूपांतरण त्रुटियों का कारण बन सकता है।

लेकिन इसका कोई मतलब नहीं है - क्या सामान्य रूपांतरण भी त्रुटियों का कारण नहीं बनना चाहिए?

क्यों नहीं है

len(100)

भाषा की व्याख्या करके काम करना (या संकलन करना)

len(str(100))

खासकर जब से यह काम करने का एकमात्र तरीका (मुझे पता है) है। भाषा जानती है कि त्रुटि क्या है, इसे ठीक क्यों नहीं किया गया?

इस उदाहरण के लिए मैंने पायथन का उपयोग किया, हालांकि मुझे लगता है कि इस छोटे से कुछ के लिए यह मूल रूप से सार्वभौमिक है।


2
perl -e 'print length(100);'प्रिंट 3.

2
और इस प्रकार भाषा की प्रकृति और उसकी प्रकार प्रणाली। वह अजगर के डिजाइन का हिस्सा है।

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

5
@PieCrust पायथन को कैसे परिवर्तित करना चाहिए? यह सच नहीं है कि सभी संभव रूपांतरण समान परिणाम देंगे।
बाकुरिउ

7
@PieCrust: तार और सरणियाँ पुनरावृत्तियाँ हैं। strएक int को चलने योग्य में परिवर्तित करने का निहितार्थ क्यों होगा ? कैसे के बारे में range? या bin( hex, oct) या chr(या unichr)? वे सभी पुनरावृत्तियाँ लौटाते हैं, भले ही strइस स्थिति में आपके लिए सबसे अधिक स्पष्ट हो।
njzk2

जवाबों:


37

इसके लायक क्या है len(str(100)), len(chr(100))और len(hex(100))सभी अलग हैं। strहै नहीं के बाद से वहाँ एक स्ट्रिंग के लिए एक पूर्णांक से अजगर में एक से अधिक अलग-अलग रूपांतरण है, यह काम करने के लिए एक ही रास्ता। उनमें से एक बेशक सबसे आम है, लेकिन यह जरूरी नहीं है कि यह कहे बिना कि आपका मतलब है। एक अंतर्निहित रूपांतरण का शाब्दिक अर्थ है, "यह बिना कहे चला जाता है"।

निहित रूपांतरणों के साथ व्यावहारिक समस्याओं में से एक यह है कि यह हमेशा स्पष्ट नहीं होता है कि कौन सा रूपांतरण लागू किया जाएगा, जहां कई संभावनाएं हैं, और पाठकों के परिणामस्वरूप यह परिणाम कोड की व्याख्या करने में त्रुटियां पैदा करते हैं क्योंकि वे सही अंतर्निहित रूपांतरण का पता लगाने में विफल होते हैं। हर कोई हमेशा कहता है कि उनका इरादा "स्पष्ट व्याख्या" है। यह उनके लिए स्पष्ट है क्योंकि यह वही है जो उनका मतलब था। यह किसी और के लिए स्पष्ट नहीं हो सकता है।

यही कारण है कि (ज्यादातर समय) पायथन स्पष्ट रूप से निहित करना पसंद करता है, यह इसे जोखिम में नहीं डालना पसंद करता है। मुख्य मामला जहां पायथन करता है वह टाइप कॉर्शन अंकगणित में है। यह अनुमति देता है 1 + 1.0क्योंकि विकल्प भी साथ रहने के लिए कष्टप्रद हो सकता है, लेकिन यह अनुमति नहीं है 1 + "1"क्योंकि इसे लगता है कि है कि क्या आप का मतलब यह निर्दिष्ट करने के लिए होना चाहिए int("1"), float("1"), ord("1"), str(1) + "1", या कुछ और। यह अनुमति नहीं देता है (1,2,3) + [4,5,6], भले ही वह परिणाम प्रकार चुनने के लिए नियमों को परिभाषित कर सकता है , जैसे यह परिणाम के प्रकार को चुनने के लिए नियमों को परिभाषित करता है 1 + 1.0

अन्य भाषाएँ असहमत हैं और बहुत सारे निहितार्थ हैं। जितना अधिक वे शामिल हैं, उतना कम स्पष्ट वे बन जाते हैं। नाश्ते से पहले "पूर्णांक पदोन्नति" और "सामान्य अंकगणितीय रूपांतरण" के लिए सी मानक से नियमों को याद रखने की कोशिश करें!


+1 यह दर्शाने के लिए कि आरंभिक धारणा, जो lenकेवल एक प्रकार से काम कर सकती है, मौलिक रूप से त्रुटिपूर्ण है।
KChaloux

2
@ केचलौक्स: वास्तव में, मेरे उदाहरण में str, chrऔर hexसभी एक ही प्रकार से लौटते हैं! मैं एक अलग प्रकार के बारे में सोचने की कोशिश कर रहा था जिसका निर्माता सिर्फ एक इंट ले सकता है, लेकिन मैं अभी तक कुछ भी नहीं आया हूं। आदर्श कुछ कंटेनर होगा Xजहां len(X(100)) == 100;-) numpy.zerosथोड़ा अस्पष्ट लगता है।
स्टीव जेसोप

2
संभावित समस्याओं के उदाहरणों के लिए इसे देखें: docs.google.com/document/d/… और विध्वंसकर्ता.com
Jens Schauder

1
अंतर्निहित रूपांतरण (मुझे लगता है कि यह बलात्कार कहा जाता है) की तरह हो रही गंदा सामान पैदा कर सकता है a == b, b == cहै, लेकिन a == cनहीं सच किया जा रहा है।
शाम

बहुत बढ़िया जवाब। सब कुछ मैं कहना चाहता था, केवल बेहतर शब्द! मेरी एकमात्र मामूली वक्रोक्ति यह है कि जावास्क्रिप्ट पूर्णांक नियमों को याद करने या अंतर्निहित रचनाकारों के लापरवाह उपयोग के साथ C ++ कोड बेस के आसपास अपने सिर को लपेटने की तुलना में सी पूर्णांक पदोन्नति काफी सरल है।
ग्रैंडऑननर

28

जैसा कि मैं इसे समझता हूं, अंतर्निहित रूपांतरण त्रुटियों का कारण बन सकता है।

आपको एक शब्द याद आ रहा है: अंतर्निहित रूपांतरण रनटाइम त्रुटियों का कारण बन सकता है

आपके जैसे साधारण मामले के लिए, यह स्पष्ट है कि आपका क्या मतलब है। लेकिन भाषा मामलों पर काम नहीं कर सकती है। उन्हें नियमों के साथ काम करने की जरूरत है। कई अन्य स्थितियों के लिए, यह स्पष्ट नहीं है कि प्रोग्रामर ने कोई त्रुटि की है (गलत प्रकार का उपयोग करके) या यदि प्रोग्रामर का मतलब यह है कि कोड का अर्थ है कि वे क्या करना चाहते हैं।

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

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


ज्यादातर उन कार्यों के बारे में बात कर रहे थे जो केवल एक प्रकार के साथ काम कर सकते हैं, जिससे रूपांतरण स्पष्ट हो जाता है। वह क्या होगा जो कई प्रकारों के साथ काम करेगा, और आपके द्वारा डाले गए प्रकार में अंतर होता है? प्रिंट ("295") = प्रिंट (295), जिससे कि चरों को छोड़कर कोई फर्क नहीं पड़ेगा। आपने जो कहा वह समझ में आता है, 3 डी पैराग्राफ को छोड़कर ... क्या आप दोहरा सकते हैं?
क्वेलकफ

30
@PieCrust - 123 + "456", क्या आप "123456" या 579 चाहते थे? प्रोग्रामिंग भाषाएं संदर्भ नहीं करती हैं, इसलिए उनके लिए "यह पता लगाना" मुश्किल है, क्योंकि उन्हें इस संदर्भ को जानना होगा कि इसके अलावा क्या किया जा रहा है। कौन सा पैराग्राफ अस्पष्ट है?
तेलस्टिन

1
इसके अलावा, शायद बेस -10 के रूप में व्याख्या वह नहीं है जो आप चाहते थे। हां, अंतर्निहित रूपांतरण एक अच्छी बात है , लेकिन केवल जहां वे संभवतः एक त्रुटि नहीं छिपा सकते हैं।
डेडुप्लिकेटर

13
@PieCrust: सच कहूं तो मुझे कभी भी len(100)वापसी की उम्मीद नहीं होगी 3। मुझे इसके प्रतिनिधित्व में बिट्स (या बाइट्स) की संख्या की गणना करने के लिए यह बहुत अधिक सहज मिलेगा 100
user541686

3
मैं @Mehrdad के साथ हूं, आपके उदाहरण से यह स्पष्ट है कि आपको लगता है कि यह 100% स्पष्ट है कि len(100)आपको 100 नंबर के दशमलव प्रतिनिधित्व के पात्रों की मात्रा देनी चाहिए। लेकिन यह वास्तव में एक धारणा है कि आप अनजान हैं। उनमें से। आप मजबूत तर्क दे सकते हैं कि क्यों बिट्स या बाइट्स या हेक्साडेसिमल प्रतिनिधित्व के 64वर्ण ( -> 2 वर्ण) द्वारा वापस आ जाना चाहिए len()
asontu

14

पर्याप्त रूपांतरण करने के लिए काफी संभव है। वह स्थिति जहां आप मुसीबत में पड़ते हैं, जब आपको नहीं पता होता है कि किस तरह से कुछ काम करना चाहिए।

इसका एक उदाहरण जावास्क्रिप्ट में देखा जा सकता है जहां +ऑपरेटर अलग-अलग समय पर अलग-अलग तरीकों से काम करता है।

>>> 4 + 3
7
>>> "4" + 3
43
>>> 4 + "3"
43

यदि कोई एक तर्क एक स्ट्रिंग है, तो +ऑपरेटर एक स्ट्रिंग कॉन्सेटेशन है, अन्यथा यह अतिरिक्त है।

यदि आपको एक तर्क दिया जाता है और यह नहीं पता है कि यह एक स्ट्रिंग या पूर्णांक है, और इसके साथ जोड़ना चाहते हैं, तो यह थोड़ा गड़बड़ हो सकता है।

इससे निपटने का एक और तरीका है बेसिक हेरिटेज (कि पर्ल निम्न प्रकार से है - देखें प्रोग्रामिंग हार्ड है, लेट्स गो गो स्क्रिप्टिंग ) ...

बेसिक में, lenफ़ंक्शन केवल समझ में आता है एक स्ट्रिंग ( दृश्य बेसिक के लिए डॉक्स:) पर किसी भी मान्य स्ट्रिंग स्ट्रिंग या चर नाम को लागू करने के लिए। FilePut फ़ंक्शन।))।

पर्ल इस संदर्भ की अवधारणा का अनुसरण करते हैं। भ्रम की स्थिति है कि के लिए प्रकार के निहित रूपांतरण के साथ जावास्क्रिप्ट में मौजूद +ऑपरेटर कभी कभी इसके अलावा जा रहा है और कभी कभी संयोजन पर्ल में ऐसा नहीं होता है, क्योंकि +है हमेशा इसके अलावा और .है हमेशा संयोजन।

अगर किसी स्केलर के संदर्भ में कुछ का उपयोग किया जाता है, तो इसका स्केलर (उदाहरण के लिए एक स्केलर के रूप में सूची का उपयोग करके, सूची ऐसे व्यवहार करती है जैसे कि यह उसकी लंबाई के अनुरूप संख्या हो)। यदि आप एक स्ट्रिंग ऑपरेटर का उपयोग करते हैं ( eqसमानता परीक्षण के लिए, cmpस्ट्रिंग तुलना के लिए) स्केलर का उपयोग किया जाता है जैसे कि यह एक स्ट्रिंग था। इसी तरह, अगर किसी गणित के संदर्भ में ( ==समानता परीक्षण के लिए और <=>संख्यात्मक तुलना के लिए) कुछ का उपयोग किया गया था , तो स्केलर का उपयोग किया जाता है जैसे कि यह एक संख्या थी।

सभी प्रोग्रामिंग के लिए मौलिक नियम है "वह कार्य करें जो व्यक्ति को सबसे कम आश्चर्यचकित करता है"। इसका मतलब यह नहीं है कि वहाँ कोई आश्चर्य नहीं है, लेकिन प्रयास व्यक्ति को कम से कम आश्चर्यचकित करने के लिए है।

Perl - php के एक करीबी चचेरे भाई के पास जा रहे हैं, ऐसी स्थितियां हैं जहां एक ऑपरेटर स्ट्रिंग या संख्यात्मक संदर्भों में कुछ पर कार्य कर सकता है और व्यवहार लोगों को आश्चर्यचकित कर सकता है। ++ऑपरेटर ऐसे ही एक उदाहरण है। संख्याओं पर, यह अपेक्षा के अनुरूप व्यवहार करता है। जब एक स्ट्रिंग पर अभिनय करते हैं, जैसे कि "aa", यह स्ट्रिंग ( $foo = "aa"; $foo++; echo $foo;प्रिंट ab) को बढ़ाता है । यह भी लुढ़क जाएगा ताकि azजब वृद्धि हो जाए ba। यह विशेष रूप से आश्चर्यजनक नहीं है।

$foo = "3d8";
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";
$foo++;
echo "$foo\n";

( आइडोन )

यह प्रिंट करता है:

3d8
3d9
3e0
4

एक ही तार पर अलग-अलग कार्य करने वाले निहितार्थ रूपांतरणों और ऑपरेटरों के खतरों में आपका स्वागत है। (पर्ल संभालता है कि कोड थोड़ा अलग तरीके से ब्लॉक होता है - यह तय करता है कि "3d8"जब ++ऑपरेटर लागू किया जाता है, तो शुरू से ही एक संख्यात्मक मूल्य होता है और 4तुरंत ( ideone ) पर जाता है - यह व्यवहार perlop में अच्छी तरह से वर्णित है : ऑटो-इंक्रीमेंट और ऑटो-डिक्रीमेंट )

अब, क्यों एक भाषा कुछ एक तरह से करती है और दूसरा क्या वह दूसरी तरह से डिजाइनरों के डिजाइन विचारों तक पहुंचती है। पर्ल का दर्शन ऐसा करने का एक से अधिक तरीका है - और मैं इनमें से कुछ कार्यों को करने के कई तरीकों के बारे में सोच सकता हूं। दूसरी ओर, Python का PEP 20 में वर्णित एक दर्शन है - The Zen of Python जो बताता है (अन्य बातों के अलावा): "इसमें एक - होना चाहिए और अधिमानतः इसे करने के लिए केवल एक - स्पष्ट तरीका है।"

इन डिज़ाइन अंतरों के कारण विभिन्न भाषाएं होती हैं। पायथन में एक संख्या की लंबाई प्राप्त करने का एक तरीका है। इस दर्शन के विरुद्ध प्रभावशाली रूपांतरण होता है।

संबंधित पढ़ना: रूबी के पास स्ट्रिंग में फिक्सनम के निहितार्थ क्यों नहीं हैं?


आईएमएचओ, एक अच्छी भाषा / रूपरेखा में अक्सर उन चीजों को करने के कई तरीके होने चाहिए जो कॉमन कॉर्नर के मामलों को अलग-अलग तरीके से हैंडल करते हैं (किसी भाषा में एक बार कॉमन केस को हैंडल करने के लिए बेहतर है या 1000 प्रोग्राम्स में 1000 बार से अधिक फ्रेमवर्क); तथ्य यह है कि दो ऑपरेटर एक ही काम करते हैं ज्यादातर समय को एक बुरी चीज नहीं माना जाना चाहिए, अगर उनके व्यवहार अलग होने पर प्रत्येक भिन्नता के लिए लाभ होगा। दो संख्यात्मक चर की तुलना करना xऔर yइस तरह से समतुल्य संबंध या रैंकिंग प्राप्त करना कठिन नहीं होना चाहिए , लेकिन IIRC पायथन के तुलनात्मक संचालक ...
सुपरकैट

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

12

कोल्डफ्यूजन ने यह सबसे अधिक किया। यह आपके निहित रूपांतरणों को संभालने के लिए नियमों के एक सेट को परिभाषित करता है, एक एकल चर प्रकार है, और वहां आप जाते हैं।

परिणाम कुल अराजकता है, जहां "4a" को 6 में जोड़ना 6.16667 है।

क्यों? खैर, क्योंकि दो चर में से पहला एक संख्या है, इसलिए परिणाम संख्यात्मक होगा। "4 ए" को एक तारीख के रूप में देखा जाता है, और इसे "4 एएम" के रूप में देखा जाता है। 4 एएम 4: 00/24: 00, या 1/6 दिन का (0.16667) है। 6 में जोड़ें और आपको 6.16667 मिलते हैं।

सूचियों में अल्पविराम के डिफ़ॉल्ट विभाजक वर्ण होते हैं, इसलिए यदि आप कभी किसी आइटम को अल्पविराम वाली सूची में जोड़ते हैं, तो आपने केवल अन्य आइटम जोड़े हैं। इसके अलावा, सूचियाँ गुप्त रूप से तार हैं, इसलिए वे तारीखों के रूप में प्राप्त कर सकते हैं यदि उनके पास केवल 1 आइटम है।

स्ट्रिंग की जाँच की जाँच करें कि क्या दोनों तार पहले तारीखों के लिए पार्स किए जा सकते हैं। क्योंकि कोई दिनांक प्रकार नहीं है, यह ऐसा करता है। संख्या और स्ट्रिंग युक्त संख्याओं, अष्टाधारी संकेतन, और बूलियन ("सच" और "हाँ", आदि) के लिए एक ही चीज़

तेजी से विफल होने और एक त्रुटि की रिपोर्ट करने के बजाय, कोल्डफ़्यूज़न आपके लिए डेटाटाइप रूपांतरणों को संभाल लेगा। अच्छे तरीके से नहीं।

बेशक, आप DateCompare जैसे स्पष्ट फ़ंक्शंस को कॉल करके अंतर्निहित रूपांतरण को ठीक कर सकते हैं ... लेकिन फिर आपने निहित रूपांतरण के "लाभ" खो दिए हैं।


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


1
वाह, "कुल अराजकता" वास्तव में!
hoosierEE

7

आप कह रहे हैं कि अंतर्निहित रूपांतरण उन कार्यों के लिए एक अच्छा विचार हो सकता है जो असंदिग्ध हैं, जैसे int a = 100; len(a), जहाँ आप स्पष्ट रूप से कॉल करने से पहले इंट को स्ट्रिंग में बदलना चाहते हैं।

लेकिन आप भूल रहे हैं इन कॉल हो सकता है कि वाक्य रचना स्पष्ट है, लेकिन वे प्रोग्रामर जो पारित करने के लिए मतलब द्वारा किए गए एक टाइपो का प्रतिनिधित्व कर सकते a1हैं, जो है एक स्ट्रिंग। यह एक विरोधाभासी उदाहरण है, लेकिन चर नामों के लिए स्वत: पूर्णता प्रदान करने वाले आईडीई के साथ, ये गलतियां होती हैं।

प्रकार प्रणाली का उद्देश्य त्रुटियों से बचने में हमारी मदद करना है, और उन भाषाओं के लिए जो सख्त प्रकार की जाँच का चयन करते हैं, निहितार्थ यह मानते हैं कि।

जावास्क्रिप्ट = के द्वारा किए गए सभी निहित रूपांतरणों के साथ जावास्क्रिप्ट की जांच करें, इतना है कि कई अब बिना-निहित-रूपांतरण === ऑपरेटर के साथ चिपके रहने की सलाह देते हैं।


6

अपने कथन के संदर्भ में एक पल के लिए विचार करें। आप कहते हैं कि यह "एकमात्र तरीका" है यह काम कर सकता है, लेकिन क्या आप वास्तव में निश्चित हैं कि यह उसी तरह काम करेगा? इस बारे में क्या:

def approx_log_10(s):
    return len(s)
print approx_log_10(3.5)  # "3" is probably not what I'm expecting here...

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

उस मामले में जहां दुभाषिया / संकलक अनुमान लगाता है कि आपका क्या मतलब है, कभी-कभी यह जादुई रूप से काम करता है, और फिर दूसरी बार आप घंटों कुछ ऐसा खर्च करते हैं जो रहस्यमय तरीके से बिना किसी स्पष्ट कारण के काम नहीं करता है। यह बहुत सुरक्षित है, औसत मामले में, यह कहा जाए कि बयान का कोई मतलब नहीं है, और कुछ सेकंड खर्च करने से यह सही हो जाता है कि आपका वास्तव में क्या मतलब है।


3

साथ काम करने के लिए नकली रूपांतरण एक वास्तविक दर्द हो सकता है। PowerShell में:

$a = $(dir *.xml) # typeof a is a list, because there are two XML files in the folder.
$a = $(dir *.xml) # typeof a is a string, because there is one XML file in the folder.

अचानक दो बार परीक्षण की आवश्यकता है और दो बार के रूप में कई कीड़े के रूप में अंतर्निहित रूपांतरण के बिना होगा।


2

स्पष्ट रूप से आपके इरादे स्पष्ट करने के लिए स्पष्ट जाति महत्वपूर्ण हैं। स्पष्ट कास्ट्स का उपयोग करने वाले सबसे पहले एक व्यक्ति को एक कहानी बताता है जो आपके कोड को पढ़ रहा है। वे प्रकट करते हैं कि आपने जानबूझकर वही किया जो आपने किया। इसके अलावा कंपाइलर पर भी यही बात लागू होती है। उदाहरण के लिए C # में निम्नलिखित अवैध है

double d = 3.1415926;
// code elided
int i = d;

कास्ट आपको ढीले सटीक बना देगा, जो आसानी से बग हो सकता है। इसलिए कंपाइलर कंपाइल करने से मना कर देता है। एक स्पष्ट कास्ट का उपयोग करके आप संकलक को बता रहे हैं: "अरे, मुझे पता है कि मैं क्या कर रहा हूं।" और वह जाएगा: "ठीक है!" और संकलन करें।


1
असल में, मैं सबसे स्पष्ट जातियों को नापसंद से अधिक नापसंद करता हूं; IMHO, इसका एकमात्र (X)yमतलब यह होना चाहिए कि "मुझे लगता है कि Y, X के लिए परिवर्तनीय है; यदि संभव हो तो रूपांतरण करें, या यदि नहीं तो एक अपवाद फेंक दें"; यदि एक रूपांतरण सफल होता है, एक भविष्यवाणी करने के लिए क्या परिणामस्वरूप मूल्य के प्रकार से परिवर्तित के बारे में कोई विशेष नियम पता करने के लिए बिना * हो जाएगा सक्षम होना चाहिए yप्रकार के X। यदि -1.5 और 1.5 को पूर्णांक में बदलने के लिए कहा जाए, तो कुछ भाषाओं में उपज (-2,1) होगी; कुछ (-2,2), कुछ (-1,1), और कुछ (-1,2)। जबकि C के नियम शायद ही अस्पष्ट हों ...
सुपरकैट

1
... इस तरह का रूपांतरण ऐसा लगता है कि यह विधि के माध्यम से विधि के माध्यम से अधिक उचित रूप से प्रदर्शन किया जाएगा (बहुत बुरा .NET में कुशल गोल और परिवर्तित कार्य शामिल नहीं हैं, और जावा कुछ हद तक मूर्खतापूर्ण तरीके से अतिभारित हैं)।
सुपरकैट

आप संकलक से कह रहे हैं " मुझे लगता है कि मुझे पता है कि मैं क्या कर रहा हूं"।
gnasher729

@ gnasher729 इसमें कुछ सच्चाई है :)
पॉल केर्चर

1

ऐसी भाषाएँ जो निहित रूपांतरणों / जातियों, या कमजोर टाइपिंग का समर्थन करती हैं, जैसा कि कभी-कभी इसका उल्लेख किया जाता है, आपके लिए ऐसी धारणाएँ बनाएगी जो आपके इच्छित या अपेक्षित व्यवहार से हमेशा मेल नहीं खाती हैं। भाषा के डिजाइनरों के पास एक ही विचार प्रक्रिया हो सकती है जैसा कि आपने एक निश्चित प्रकार के रूपांतरण या रूपांतरणों की श्रृंखला के लिए किया था, और उस मामले में आपको कभी कोई समस्या नहीं दिखाई देगी; हालाँकि, यदि वे नहीं करते हैं, तो आपका कार्यक्रम विफल हो जाएगा।

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

दूसरे दिन मेरे एक दोस्त ने अपने 2 साल के बच्चे से पूछा कि 20 + 20 क्या है और उसने 2020 का जवाब दिया। मैंने अपने दोस्त से कहा, "वह एक जावास्क्रिप्ट प्रोग्रामर बनने जा रहा है"।

जावास्क्रिप्ट में:

20+20
40

20+"20"
"2020"

इस प्रकार आप देख सकते हैं कि समस्याएँ उत्पन्न हो सकती हैं और यह ऐसा क्यों है जो अभी तय नहीं किया जा सका है। मैं जिस तर्क पर बहस करूंगा, वह स्पष्ट जातियों का उपयोग करना है।

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