2014-04-13 4 views
5

the Hack language टाइप सिस्टम में, क्या "शीर्ष" प्रकार है, जिसे "किसी भी प्रकार" या सार्वभौमिक "ऑब्जेक्ट" प्रकार के रूप में भी जाना जाता है? यही वह प्रकार है जो सभी प्रकार के उप-वर्ग हैं?हैक भाषा में शीर्ष प्रकार क्या है?

The manual mentions "mixed" types, जो समान हो सकता है, लेकिन वास्तव में समझाया नहीं गया है। कुछ जगहों पर प्रकार की घोषणा को छोड़ने की संभावना भी है। हालांकि, यह हर जगह नहीं किया जा सकता है, उदा। अगर मैं शीर्ष प्रकार पर string से कोई फ़ंक्शन घोषित करना चाहता हूं, तो यह स्पष्ट नहीं है कि मैं यह कैसे करता हूं। function (string): mixed?

उत्तर

4

मैं फेसबुक पर हैक पर काम कर रहा एक इंजीनियर हूं। यह वास्तव में अंतर्दृष्टिपूर्ण और दिलचस्प सवाल है। आप वास्तव में क्या प्राप्त कर रहे हैं, इस पर निर्भर करते हुए, हैक में इसके कुछ अलग-अलग बदलाव हैं।

सबसे पहले, mixed के बारे में बात करते हैं। यह सब कुछ का सुपरटेप है। उदाहरण के लिए, इस typechecks:

<?hh // strict 
function f(): mixed { 
    return 42; 
} 

लेकिन क्योंकि यह सब कुछ के महाप्रकार है, तो आप एक mixed मूल्य के साथ ज्यादा कुछ नहीं कर सकते हैं जब तक आप मामले यह वास्तव में है पर विश्लेषण, is_int, instanceof, आदि यहाँ एक है के माध्यम से आप f() का परिणाम का उपयोग करना होगा कैसे की उदाहरण:

<?hh // strict 
function g(): int { 
    $x = f(); 
    if (is_int($x)) { 
    return $x; 
    } else { 
    return 0; 
    } 
} 

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

<?hh 
// No "strict" since we are omitting annotations 
function f2() { 
    return 42; 
} 
function g2(): string { 
    return f2(); 
} 

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

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

अंत में: यदि आपको कोई फर्क नहीं पड़ता है, तो क्या आप डॉक्स पृष्ठों पर "एक दस्तावेज़ीकरण बग फाइल" दबा सकते हैं जो भ्रमित या अस्पष्ट थे, या किसी भी तरह से सुधार किया जा सकता है? हम आदर्श रूप से docs.hhvm.com को इस तरह की चीजों के लिए एक-स्टॉप जगह बनना चाहते हैं, लेकिन ऐसे दस्तावेज़ों में निश्चित रूप से छेद हैं जिन्हें हम उम्मीद कर रहे हैं कि स्मार्ट, उत्साही लोग स्वयं की तरह मदद करेंगे। (यानी, मैंने सोचा था कि इस सामान को दस्तावेज़ों में अच्छी तरह से समझाया गया था, लेकिन चूंकि आप उलझन में हैं, यह स्पष्ट रूप से मामला नहीं है, और हम वास्तव में एक बग रिपोर्ट की सराहना करेंगे जहां आप खो गए हैं।)

+0

महान उत्तर, धन्यवाद! कुछ स्पष्टीकरण: (1) प्रत्येक बार जब कोई टिप्पणी छोड़ी जाती है, तो यह ': any' के बराबर होती है?(2) 'सख्त' मोड ध्वनि होना चाहिए, लेकिन अन्य मोड जानबूझकर बेकार हैं; क्या यह सही है? यह बहुत अच्छा होगा अगर आप टाइप सिस्टम को अधिक औपचारिक रूप से वर्णित एक श्वेत पत्र प्रकाशित कर सकें। ऐसा लगता है जैसे हैक टाइप सिस्टम उस तरह के लायक होने के लिए पर्याप्त रूप से अभिनव है। पुन: प्रलेखन कीड़े: करेंगे! – jameshfisher

+0

1) एक लापता एनोटेशन "कोई" प्रकार है, हालांकि वहां कोई प्रकार नहीं है जिसे आप स्पष्ट रूप से अपने कोड में लिख सकते हैं। 2) अन्य तरीके "जानबूझकर अस्वस्थ" हैं, इसे रखने का एक तरीका है, लेकिन हम इसे "गतिशील टाइपिंग स्वीकार करें" और "रनटाइम तक देरी प्रकार प्रवर्तन की अनुमति दें" और "पूर्ण untyped PHP इंटरऑपरेबिलिटी की अनुमति दें" के बारे में सोचते हैं। मुझे यकीन नहीं है कि क्या हमारे पास श्वेतपत्र या कुछ भी लिखने की योजना है, हालांकि शायद हमें बहुत से लोगों को दिलचस्पी होनी चाहिए :) जूलियन का हालिया हैक डे डे टॉक दूसरे छमाही में कुछ आंतरिक विवरणों में जाता है: https: // www .youtube.com/watch? v = BnJQJNGkUdM –

+0

री पॉइंट (1), क्या वाकई सच है? फिर [इस उदाहरण] में क्या चल रहा है (http://pastebin.com/wRXJLGQc) जो टाइप-चेक करता है और त्रुटि के बिना चलता है? जैसा कि ऊपर वर्णित है, या 'अज्ञात सामान्य प्रकार' के रूप में 'कोई भी' व्याख्या किया जा रहा है जिसे किसी भी प्रकार की त्रुटि उत्पन्न नहीं होती है? – jameshfisher

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