2008-09-08 14 views
13

एक्शनस्क्रिप्ट 3.0 (और मैं सामान्य रूप से जावास्क्रिप्ट और ईसीएमएस्क्रिप्ट मानता हूं) मूल प्रकारों जैसे कि इन्ट्स के लिए पास-बाय-रेफरेंस की कमी है। नतीजतन मैं वास्तव में एक बकवास से मूल्य वापस पाने के लिए मिल रहा हूँ। इस के आसपास काम करने के लिए सामान्य पैटर्न क्या है?एक्शनस्क्रिप्ट 3.0 में पास-बाय-रेफरेंस अनुकरण करने का सबसे साफ तरीका क्या है?

उदाहरण के लिए, क्या एक्शनस्क्रिप्ट में स्वैप (intA, intB) लागू करने का एक साफ तरीका है?

उत्तर

7

मैं विश्वास सबसे अच्छा तुम कर सकते हो एक समारोह के लिए एक तर्क के रूप में एक कंटेनर वस्तु गुजरती हैं और उस वस्तु में कुछ गुण के मूल्यों को बदलने है:

function swapAB(aValuesContainer:Object):void 
{ 
    if (!(aValuesContainer.hasOwnProperty("a") && aValuesContainer.hasOwnProperty("b"))) 
     throw new ArgumentError("aValuesContainer must have properties a and b"); 

    var tempValue:int = aValuesContainer["a"]; 
    aValuesContainer["a"] = aValuesContainer["b"]; 
    aValuesContainer["b"] = tempValue; 
} 
var ints:Object = {a:13, b:25}; 
swapAB(ints); 
+1

hasseg, मैं आशा किसी को बाहर पकड़े रहा हूँ एक चाल है कि और अधिक सुरुचिपूर्ण है जानता है, लेकिन यह संभावना है कि अपने उत्तर को श्रेष्ठ से एक है। मुझे लगता है कि प्राकृतिक पालन निर्भर है: इस सीमा किसी और पागल है, या यह मेरे बस है? :) –

+0

यह मुझे हर अब और फिर एक छोटे से पागल ड्राइव। मुझे नहीं लगता कि आप सभी कि एक पर भी अकेले हैं है। –

-2

ActionScript जावास्क्रिप्ट की तरह काम करता है, तो

[a,b] = [b,a] 
+0

क्षमा करें, लेकिन है कि ActionScript में काम नहीं करता – Turambar

4

मुझे लगता है एक वैकल्पिक कहीं बात की इस तरह परिभाषित करने होगा ...

public class Reference { 
    public var value:*; 
} 

फिर उन फ़ंक्शंस का उपयोग करें जो "पॉइंटर्स" के रूप में कार्य करने के लिए कुछ संदर्भ तर्क लेते हैं यदि आप वास्तव में केवल "आउट" पैरामीटर ढूंढ रहे हैं और या तो उन्हें रास्ते में शुरू कर रहे हैं या नहीं और आपका स्वैप बन जाएगा:

function swap(Reference a, Reference b) { 
    var tmp:* = a.value; 
    a.value = b.value; 
    b.value = tmp; 
} 

और आप हमेशा पागल हो जाना और विशिष्ट IntReference, StringReference, आदि

3

तुम भी पूर्णांक के बजाय एक आवरण इस्तेमाल कर सकते हैं निर्धारित कर सकते हैं:

public class Integer 
{ 
    public var value:int; 

    public function Integer(value:int) 
    { 
     this.value = value; 
    } 
} 

बेशक, यह अगर आप इस्तेमाल कर सकते हैं और अधिक उपयोगी होगा ऑपरेटर अधिभार ...

4

यह nitpicking है, लेकिन int, String, Number और दूसरों संदर्भ द्वारा पारित कर रहे हैं, यह सिर्फ है कि वे अडिग हैं। बेशक, प्रभाव वही है जैसे वे मूल्य से पारित किए गए थे।

1

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

यदि आपको केवल डेटा का एक गुच्छा वापस करने की आवश्यकता है, तो ऑब्जेक्ट वापस करें। पास-बाय-रेफ सेमेन्टिक्स की तुलना में ईसीएमएस्क्रिप्ट शैली को ध्यान में रखते हुए यह अधिक है।

0

असाइनमेंट को नष्ट करना (उदाहरण के लिए [ए, बी] = [बी, ए]) ईसीएमए -262 3 विनिर्देश में परिभाषित नहीं है, और यह जावास्क्रिप्ट 1.5 में लागू नहीं किया गया है, जो जेस्क्रिप्ट कार्यान्वयन के बराबर संस्करण है अर्थात। मैंने एएस 4 विनिर्देशों के पूर्वावलोकन में यह वाक्यविन्यास देखा है, और मुझे विश्वास है कि यह जावास्क्रिप्ट 1.7 का हिस्सा है।

2

बस कुछ जावा कोड देखें। जावा ने सम्मेलन किया है कि संदर्भ प्रकार संदर्भ द्वारा पारित किए जाते हैं और प्रारंभिक प्रकारों की शुरूआत के बाद मूल्य से पारित किया जाता है। यह कई तरीकों से एक बहुत अच्छा मॉडल है।

लेकिन स्वैप बारे में बात कर, जावा/AS3 में एक स्वैप करने के लिए सबसे अच्छा और आसान तरीका निम्न तीन पंक्तियों से है:

 
var temp:int = array[i]; 
array[j] = array[i]; 
array[i] = temp; 

थेरेस नहीं वास्तव में किसी भी एक समारोह का उपयोग करने के लिए एक सरल स्वैप करने के लिए कारण , जब आप यह तेजी से सिर्फ 3 लाइनों के साथ कर सकते हैं।

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