eval() چه جوري كار ميكنه

naeim_crack

Active Member
سلام
اقا اين دستور eval(); كارش چيه و چه جوري كار مي كنه يك سوال ديگه هم داشتم
من يك متغيير به شكل زير دارم
کد:
pat="book"
و هميشه اين متغيير pat عوض ميشه حالا من مي خوام مقدار متغيير رو توي يك مسير قرار بدم به شكل زير
کد:
_root.*(var pat).text="naeim"
مي خوام به جاي*(var pat) مقدار pat كه همون book هستش قرار بگيره مثل زير بشه يعني
کد:
_root.book.text="naeim"
مرسي
 

fafa^mx

Member
eval() برای تبدیل یک String به Object استفاده میشه!
مصلا ما Object به نام "ali" نداریم!اما میتونیم آبجکتی به نام ali داشته باشیم!بنا بر این eval("ali") ==> ali
 

naeim_crack

Active Member
سلام
در رابطه با eval بيشتر توضيح بدخ ببنيم كه به چه درد مي خوره قسمت دوم سوال كه خيلي مهمه هنوز مونده
منتظرم
 

idw

Member
همونطوري كه بهت گفتم به نظرم براي سوال دومت بايد از object.porotoType يا يك همچين چيزايي بايد كار كنيد.حالا بايد پيداش كنيد توي رفرنس فلش :lol: عجب راهنمايي خفني.
 

phoenix

Member
من سعي مي كنم جواب هر 2 سوال را يكجا بدم:

بعضي از زبانهاي برنامه نويسي اجازه تعريف كردن متغير به صورت dynamic را مي دهند بدين معني كه نام و مقدار متغير در runtime مشخص مي شود همچنين نام متغير مي تواند خود متغير باشد و يا در تتيجه يك فرايند منطقي بدست آيد. فلش يكي از اين زبانهاست.

از زمان فلش 4 دو دستور eval و set براي ايجاد و بازخواني متغير ها وجود دارند. براي مثال براي ايجاد 10 متغير به نامهاي a0 تا a9 با مقدار هاي 0 تا 9 مي توان از set استفاده كرد:

کد:
for(var i=0; i<10; i++)
{
	set("a" + i, i);
}

همچنين براي بازخواني متغيرهاي بالا مي توان از eval استفاده كرد:

کد:
for(var i=0; i<10; i++)
{
	trace(eval("a" + i));
}

eval وظيفه تبديل يك String را به Identifier و دستور set وظيفه نسبت دهي يك مقدار به يك متغير و ايجاد Identifer را به عهده دارند، Identifer در فلش هر آن چيزي است كه مقداري را در خود نگهداري مي كند مانند اسامي كلاسها، MovieClip ها، Object ها و يا متغير هاي ساده.


اين دو دستور هر دو دستورهاي قديمي هستند شايد در يكي دو نسخه آيده فلش اين دستورات deprecate شوند. من تقريبا در هيچ جا استفاده اي براي اين دو دستور نمي بينم.

از زمان فلش 5 امكان localize كردن data بر روي object ها با استفاده از Dot Notation و همچنين Bracket Notation وجود دارد بنابراين مي توان از اين روش به جاي استفاده از eval و set استفاده كرد:

هنگامي كه يك متغير معلوم را در root_ تعريف مي كنيم مي توانيم از Dot Notation براي ايجاد و بازخواني استفاده كنيم:

کد:
_root.variable = 1;
trace(_root.variable);

ولي وقتي بخواهيم يك متغير ديناميك تعريف كنيم Bracket Notation استفاده ميكنيم:

کد:
_root["variable"] = 1;
trace(_root["variable"]);

اين شيوه كارامد تر و از نظر OO كاملتر از eval و set مي باشد بنابراين مثال بالا با اين روش به صورت زير در مي آيد:

کد:
for(var i=0; i<10; i++)
{
	this["a" + i] = i;
}

for(var i=0; i<10; i++)
{
	trace(this["a" + i]);
}

استفاده هاي زيادي از Bracket Notation در فلش ميشود مثلا مي توان كليه property هاي يك Object را مرور كرد:

کد:
obj = {val1:1, val2:2, val3:3, val4:4};

for(var i in obj) trace(i + ": " + obj[i]);

و يا يك نكته بسيار جالب اينكه با استفاده از اين روش مي توان متغير هايي يا نام هاي غير مجاز ايجاد كرد:

کد:
this["123"] = new Object();

this["123"]["@yahoo.com"] = new Object("[email protected]");

trace(this["123"]["@yahoo.com"]);

در صورتي كه هرگز نميتوان اين متغيرها را به صورت Dot Notation استفاده كرد:

کد:
trace([email protected]);		// error
 

naeim_crack

Active Member
سلام phoenix دستت درد نكنه بابت اين توضيح كامل

آقا يك مشگل پيش مياد اگه من بخوام به شكل زير عمل كنم اينو ببين
کد:
tpath="_root.book.nima"
[tpath].text="naeim";
ولي اين دستور اشتباه هستش و فلش اينو ايراد ميگره وحتما بايد به شكل زير باشه
کد:
_root[tpath].text="naeim";
اين درسته ولي ديگه متغيير رو نمي خوني اما وقتي از eval استفاده كنيم فكر كنم بشه اما مشگل سر اين دستور هستش كه بعضي وقتها جواب رو درست ميده اما بعضي وقتي ميزنه سرش و ديگه كار نميكنه :lol:
کد:
tpath="_root.book.nima"
ttpath=eval(tpath);
ttpath.text="naeim";

اگه دستور بالا كار كنه ديگه مشكلي پيش نمياد ولي كار نميكنه :cry:
اين فايل رو يك بار درستش كردم كار ميكنه اما وقتي همون اكشن رو يه جاي ديگه ميبرم eval از كار ميوفته
مرسي
 

phoenix

Member
در صورتي كه از absolute path استفاده كنيد و رشته اي كه با آن كار مي كنيد absolute path يك متغير باشد فقط با eval مي توان كار كرد:

مثلا جايي از برنامه شما به صورت زير است:
کد:
oo=targetPath(_parent);
ll=oo+"."+dname;
kk=eval(ll);
trace("dname path ===> "+kk);

اين كاملا درسته با كمي خلاصه سازي ميشه به اين صورت نوشتش:
کد:
trace("dname path ===> " + eval(_parent+"."+dname));

اما هميشه مي توان از relative path و Bracket Notation استفاده كرد:

کد:
trace("dname path ===> "+_parent[dname]);
 

جدیدترین ارسال ها

بالا