سؤال

أي فكرة عن كيفية عودة متغيرات متعددة من وظيفة في ActionScript 3?

أي شيء مثل VB.NET حيث يمكنك الحصول على المدخلات الحجة متغير تعديل (ByRef الحجج)?

Sub do (ByRef inout As Integer)
 inout *= 5;
End Sub

Dim num As Integer = 10
Debug.WriteLine (num)        '10
do (num)
Debug.WriteLine (num)        '50

أي شيء وبصرف النظر عن إعادة النقابي?

return {a:"string 1", b:"string 2"}
هل كانت مفيدة؟

المحلول

كل شيء في AS3 هو إشارة جانبا من [u] [إينتس].أن التعميم الذي يرث كل شيء Object سوف تعطى وظيفة بالإشارة.

أن يقال, الطريقة الوحيدة التي أعتقد يمكنك القيام به هو استخدام الطبقة الحاوية مثل Array أو String ("5" و التحويل+الرياضيات).

نصائح أخرى

نقلا عن بحث المصدر:

في ActionScript 3.0, جميع الحجج التي مرت بالرجوع لأن كل القيم يتم تخزين الكائنات.ومع ذلك ، فإن الكائنات التي تنتمي إلى أنواع البيانات البدائية ، التي تشمل منطقية ، عدد ، الباحث ، uint ، سلسلة ، خاصة الشركات التي تجعلهم يتصرفون كما لو كانوا تمريرها حسب القيمة.

الذي قادني إلى البحث عن المصدر الكنسي.

يبدو أن سلاسل رجات الوحدات المنطقية يتم تمريرها حسب القيمة. حاولت هذا المقتطف قليلا في فلاش و كانت النتائج السلبية:

function func(a:String){
    a="newVal";
}

var b:String = "old";

trace(b)    //  old
func(b);
trace(b)    //  old

لذا...هو سلسلة القائمة السوداء نوع البيانات أيضا ؟ منطقية أيضا ؟ أعني ما طريقة مؤكدة تقول والتي يتم تمرير أنواع من مرجع ؟

إنه قبل كل شيء قيمة ، إذا فهم البرمجة C سوف تكون مألوفة مع مفهوم المؤشرات.

التفكير في مؤشر كما يشير إلى شيء في الذاكرة ، كل متغير أسماء "بوب من (بوب = new person();)" هي أساسا المؤشرات التي كنت تعمل مع.

الآن عندما تقوم بتعريف دالة ، لأنها قبل كل شيء قيمة

function Test(a:Object, b:Object):void {
   a = b;
}

يمكنك التفكير في كل من "أ" و "ب" أن تكون مؤشرات جديدة ، وذلك فقط في "اختبار" وظيفة القيام به على حد سواء "أ" و "ب" موجودة نشير إلى شيء في الذاكرة.

لذلك دعونا استخدامه

var s1:Sprite = null;
var s2:Sprite = new Sprite;
Test(s1,s2);

حتى s1 و s2 المؤشرات تشير دائما إلى "null" و "العفريت الجديد في الذاكرة" على التوالي ، ما لم يتم تعديلها كما s1 و s2 داخل "النطاق" <- يرجى التأكد من فهم نطاق متغير حتى قبل أن تحاول معالجة هذا.

و من خلال وظيفة لدينا الآن اثنين من مؤشرات جديدة "a" لافتا إلى "null" و "ب" لافتا إلى "نفس العفريت في الذاكرة كما s2".لذلك منذ الكائنات والمصفوفات أساسا من مجموعات من المؤشرات اثنين فقط مؤشرات جديدة تم إنشاؤها بواسطة الدالة على استخدام "a" و "b" أي خصائص/كشفت المتغيرات "مؤشرات إلى البيانات في الذاكرة" من "أ" أو "ب" سوف لا يزال يكون بالضبط نفس تلك "s1" و "s2" و هي نفس المؤشرات.

حتى داخل الدالة عند "أ" يحصل على مجموعة "ب", حقا كل ما يحدث هو "" مؤشر الآن يشير إلى نفسه شيء من "ب".ولكن "s1" و "s2" لا تزال تشير إلى ما كانوا يشيرون قبل.

!!!!إذا كان هذا بالرجوع فإنك لن تكون قادرا على التفكير في "أ" و "ب" كما مؤشرات جديدة ، فإنها تكون في الواقع "s1" و "s2" أنفسهم ، باستثناء تكتب بها مثل "أ" و "ب".

خطأ خطأ خطأ خطأ..كل حجة يتم تمريرها حسب القيمة!!!حقيقة يمكنك تغيير خاصية داخل الكائن الذي تم تمريره لا يعني يمكنك تغيير الكائن نفسه.محاولة التعليمة البرمجية التالية

function Test(a:Object, b:Object):void {
   a = b;
}

function Test2():void {
   var s1:Sprite = null;
   var s2:Sprite = new Sprite;

   Test(s1,s2);
   Trace(s1);
   Trace(s2);
}

وهنا تتبع النتيجة :

null
[object Sprite]

ملاحظة الفرق الدقيق بين DarthZorG المثال و هذا واحد من فلاش مستندات:

function passByRef(objParam:Object):void 
{ 
    objParam.x++; 
    objParam.y++; 
    trace(objParam.x, objParam.y); 
} 
var objVar:Object = {x:10, y:15}; 
trace(objVar.x, objVar.y); // 10 15 
passByRef(objVar); // 11 16 
trace(objVar.x, objVar.y); // 11 16

النقطة:لا يمكنك تغيير ما الإشارة التي تشير إلى ولكن يمكنك تغيير البيانات المرجعية يشير إلى ، طالما أن المرجعية هو كائن/مجموعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top