2014-09-18 8 views
7

में मैं आज hacklang सीखने शुरू कर दिया है और अब मैं थोड़ा आकार पर अटक कर रहा हूँ: http://docs.hhvm.com/manual/en/hack.shapes.phpआकृतियाँ hacklang

मैं आकार की अवधारणा को समझने और यह मेरे लिए वास्तव में उपयोगी लगता है, लेकिन मैं क्यों के लिए नहीं समझ सकता उदाहरण के लिए इस कोड को किसी भी त्रुटि फेंक नहीं करता है:

<?hh 

type Point2D = shape('x' => int, 'y' => int); 

function dotProduct(Point2D $a, Point2D $b): int { 
    return $a['x'] * $b['x'] + $a['y'] * $b['y']; 
} 

function main_sse(): void { 
    echo dotProduct(shape('x' => 3, 'y' => 'this should cause an fatal error?'), shape('x' => 4, 'y' => 4)); 
} 

main_sse(); 

'y' कुंजी पूर्णांक के रूप में परिभाषित किया गया है, लेकिन जब मैं एक स्ट्रिंग पारित, कोई त्रुटि दिखाया गया है। आपकी मदद के लिए धन्यवाद :)

+0

यदि आप संभव हो तो नई फाइलों पर अपनी फ़ाइल के शीर्ष पर "

उत्तर

9

असल हैक कोड को क्रियान्वित करने के लिए जरूरी सब कुछ typecheck नहीं है। आपको वास्तव में run a separate tool to enforce the type system, as described in the docs article linked here की आवश्यकता है। जब आप ऐसा करते हैं, तो आपको एक त्रुटि है कि कुछ इस तरह दिखता, HHVM का सही संस्करण के आधार पर मिल जाएगा तुम हो:

File "shapes.php", line 10, characters 19-23: 
Invalid argument (Typing[4110]) 
File "shapes.php", line 3, characters 41-43: 
This is an int 
File "shapes.php", line 10, characters 42-76: 
It is incompatible with a string 

HHVM का आधुनिक संस्करण भी आप पर चिल्लाना होगा यदि आप नहीं चल रहे हैं typechecker; मुझे संदेह है कि आप पुराने संस्करण चला रहे हैं, इससे पहले कि हमें एहसास हुआ कि यह भ्रम का मुद्दा था - क्षमा करें!

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

+0

+1 ग्रेट उत्तर, और स्पष्टीकरण के लिए धन्यवाद। –

+0

उत्तर के लिए धन्यवाद :) ठीक है वर्तमान में मैं हिपहॉप वीएम 3.3.0-देव + 2014.08.22 (रिलायंस) का उपयोग कर रहा हूं। मेरे ज्ञान के लिए यह नवीनतम सार्वजनिक संस्करण है। वैसे भी, उम्मीद है कि एचएचवीएम भविष्य में इस तरह के प्रकार के मेल के लिए अपवाद या त्रुटि फेंक देगा :) – WebDevHere

2

दुभाषिया गणना करने के लिए संख्या के रूप में 'y' कुंजी का मूल्यांकन करने का प्रयास करेगा।

उदाहरण:

echo 4 * '6'; 
// prints 24 

echo 4 * '6foo'; 
// prints 24 

echo 'foo' * 42; 
// prints 0, because floatval('foo') === 0 

आपका स्थिति तीसरा उदाहरण की तरह है। floatval('this should cause an fatal error?') === 0, इसलिए गणना है:

$a['x'] * $b['x'] + $a['y'] * $b['y'] === 3 * 4 + 0 * 4 === 12 
+0

आपके उत्तर के लिए धन्यवाद :) लेकिन आकार के बिंदु क्या है? परिभाषित करने का क्या मतलब है कि 'वाई' पूर्णांक है? यह नियमित सरणी की तरह काम करता है। – WebDevHere

+0

मैं यहां अपनी गहराई से थोड़ा सा हूं, कभी भी हैकलांग के साथ नहीं खेला। लेकिन स्पष्ट रूप से दुभाषिया एक रूपांतरण कर रहा है। मुझे लगता है कि समस्या यह है कि आप 'प्वाइंट 2 डी' के लिए टाइप परिभाषा को देख रहे हैं, लेकिन आपका' डॉट प्रोडक्ट 'कॉल' आकार 'का उपयोग करता है, न कि' प्वाइंट 2 डी ', इसलिए टाइप चेक कभी नहीं होता है। –

+1

यह वास्तव में एक प्रकार की त्रुटि है, आपको वास्तव में अलग-अलग प्रकार की त्रुटियों को देखने की आवश्यकता है - कृपया एक पूर्ण स्पष्टीकरण के लिए मेरा उत्तर देखें। –