ActionScript 3.0, dil kullanımında tecrübesiz olan programcılar için yeni gibi görünen bazı işlev parametreleri işlevleri sağlar. Değere veya başvuruya göre parametre iletme kavramı çoğu programcılara tanıdık gelse de, arguments nesnesi ve ... (rest)parametresi birçoğu için yeni olabilir.
Değere veya başvuruya göre argümanları iletme
Çoğu programlama dilinde, değere veya başvuruya göre argümanları iletme arasındaki ayrımın anlaşılması önemlidir; bu ayrım kodun tasarlanma şeklini etkileyebilir.
Değere göre iletilme, argüman değerinin, işlev içinde kullanılmak üzere yerel bir değişkene kopyalanması anlamına gelir. Başvuruya göre iletilme ise gerçek değerin değil, yalnızca argümanın bir başvurusunun iletilmesi anlamına gelir. Gerçek argümanın herhangi bir kopyası oluşturulmaz. Bunun yerine, argüman olarak iletilen değişkenin başvurusu oluşturulur ve işlev içinde kullanılmak üzere yerel değişkene atanır. Yerel değişken, işlev dışındaki bir değişkenin başvurusu olarak, size orijinal değişkenin değerini değiştirme yeteneği sağlar.
ActionScript 3.0'da, tüm değerler nesneler olarak saklandığından, tüm argümanlar başvuruya göre iletilir. Ancak, Boolean, Number, int, uint ve String gibi ilkel veri türlerine ait olan nesneler, değere göre iletilmiş gibi davranmasını sağlayan özel operatörlere sahiptir. Örneğin, aşağıdaki kod, her ikisi de int türünde olan xParam ve yParam adında iki parametreyi tanımlayan passPrimitives() adında bir işlev oluşturur. Bu parametreler, passPrimitives() işlevinin gövdesinde bildirilen yerel değişkenlere benzer. İşlev, xValue ve yValue argümanlarıyla çağrılırsa, xParam ve yParam parametreleri, xValue ve yValue tarafından temsil edilen int nesnelerinin başvurularıyla başlatılır. Argümanlar ilkel olduğundan, bunlar değere göre iletilmiş gibi davranır. xParam ve yParam öğeleri başlangıçta xValue ve yValue nesnelerini içerse de, işlev gövdesi içinde değişkenler üzerinde yapılan tüm değişiklikler bellekte değerlerin yeni kopyalarını oluşturur.
function passPrimitives(xParam:int, yParam:int):void
{
xParam++;
yParam++;
trace(xParam, yParam);
}
var xValue:int = 10;
var yValue:int = 15;
trace(xValue, yValue);// 10 15
passPrimitives(xValue, yValue); // 11 16
trace(xValue, yValue);// 10 15
passPrimitives() işlevi içinde, xParam ve yParam değerleri artırılır ancak bu, son trace deyiminde gösterildiği gibi, xValue ve yValue değerlerini etkilemez. İşlevin içindeki xValue ve yValue öğeleri, bellekte, işlev dışında aynı addaki değişkenlerden ayrı olarak varolan yeni konumları işaret ettiğinden, parametreler xValue ve yValue değişkenleriyle aynı şekilde adlandırılsaydı da bu durum geçerli olurdu.
Diğer tüm nesneler—başka bir deyişle, ilkel veri türünde olmayan nesneler—her zaman başvuruya göre iletilir ve bu da size orijinal değişkenin değerini değiştirme yeteneği sağlar. Örneğin, aşağıdaki kod, x ve y olmak üzere iki özellikle objVar adında bir nesne oluşturur. passByRef() işlevine argüman olarak iletilen nesne. Nesne ilkel türde olmadığından, yalnızca başvuruya göre iletilmekle kalmaz aynı zamanda başvuru olmaya devam eder. Başka bir deyişle, işlev içinde parametreler üzerinde yapılan değişiklikler, işlev dışındaki nesne özelliklerini etkiler.
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
objParam parametresi, genel objVar değişkeniyle aynı nesneye başvurur. Örnekteki trace deyimlerinde de görebileceğiniz gibi, objParam nesnesinin x ve y özellikleri üzerinde yapılan değişiklikler, objVar nesnesinde yansıtılır.
Varsayılan parametre değerleri
ActionScript 3.0'daki bir yenilik de, bir işlev için varsayılan parametre değerleri bildirme yeteneğidir. Varsayılan parametre değerleri içeren bir işleve yapılan çağrı, varsayılan değerleri içeren bir parametreyi çıkarırsa, o parametre için işlev tanımında belirtilen değer kullanılır. Varsayılan değerlere sahip tüm parametrelerin parametre listesinin sonuna yerleştirilmesi gerekir. Varsayılan değer olarak atanan değerlerin derleme zamanı sabitleri olması gerekir. Bir parametre için varsayılan bir değerin olması, o parametreyi etkili şekilde isteğe bağlı parametre yapar. Varsayılan değer içermeyen bir parametre, zorunlu parametre olarak değerlendirilir.
Örneğin, aşağıdaki kod üç parametre içeren bir işlev oluşturur, bu parametrelerin ikisi varsayılan değerleri içerir. Yalnızca bir parametreyle işlev çağrıldığında, parametrelerin varsayılan değerleri kullanılır.
function defaultValues(x:int, y:int = 3, z:int = 5):void
{
trace(x, y, z);
}
defaultValues(1); // 1 3 5
arguments nesnesi
Bir işleve parametreler iletildiğinde, işlevinize iletilen parametreler hakkındaki bilgilere erişmek için arguments nesnesini kullanabilirsiniz. arguments nesnesinin önemli yönlerinden bazıları şunlardır:
arguments nesnesi, işleve iletilen tüm parametreleri içeren bir dizidir.
arguments.length özelliği, işleve iletilen parametrelerin sayısını bildirir.
arguments.callee özelliği, işlevin kendisine bir başvuru sağlar, bu da işlev ifadelerine yapılan yinelemeli çağrılar için kullanışlıdır.
Not: Herhangi bir parametre arguments olarak adlandırılırsa veya ... (rest) parametresini kullanırsanız, arguments nesnesi kullanılamaz.İşlev gövdesinde arguments nesnesie başvurulursa, ActionScript 3.0, işlev çağrılarının, işlev tanımında tanımlananlardan daha fazla parametre içermesine olanak sağlar, ancak parametre sayısı, zorunlu parametre (ve isteğe bağlı olarak isteğe bağlı parametre) sayısıyla eşleşmezse, bu katı modda bir derleyici hatası oluşturur. İşlev tanımında tanımlansa da tanımlanmasa da, işleve iletilen herhangi bir parametreye erişmek için arguments nesnesinin dizi yönünü kullanabilirsiniz. Yalnızca standart modda derleme yapan aşağıdaki örnek, traceArgArray() işlevine iletilen tüm parametreleri izlemek için arguments.length özelliğiyle birlikte arguments dizisini kullanır:
function traceArgArray(x:int):void
{
for (var i:uint = 0; i <>traceArgArray(1, 2, 3);
// output:
// 1
// 2
// 3arguments.callee özelliği genellikle yineleme oluşturmak için adsız işlevlerde kullanılır. Kodunuza esneklik katmak için bunu kullanabilirsiniz. Yinelemeli işlevin adı, geliştirme döngünüzde değişirse, işlev adı yerine arguments.callee öğesini kullanıyorsanız, işlev gövdenizde yinelemeli çağrıyı değiştirmekle ilgili endişe duymanız gerekmez. Yinelemeyi etkinleştirmek için, aşağıdaki işlev ifadesinde arguments.callee özelliği kullanılır:
var factorial:Function = function (x:uint)
{
if(x == 0)
{
return 1;
}
else
{
return (x * arguments.callee(x - 1));
}
}
trace(factorial(5)); // 120İşlev bildiriminizde ... (rest) parametresini kullanırsanız, arguments nesnesini kullanamazsınız. Bunun yerine, parametreler için bildirdiğiniz parametre adlarını kullanarak parametrelere erişmeniz gerekir.
Ayrıca parametre adı olarak "arguments" dizesini kullanmaktan kaçınmalısınız, aksi takdirde bu, arguments nesnesini gölgeler. Örneğin, bir arguments parametresi eklenecek şekilde traceArgArray() işlevi yeniden yazılırsa, işlev gövdesinde arguments öğesine başvurular, arguments nesnesini değil, parametreyi ifade eder. Aşağıdaki kod herhangi bir çıktı oluşturmaz:
function traceArgArray(x:int, arguments:int):void
{
for (var i:uint = 0; i <>
Önceki ActionScript sürümlerinde bulunan arguments nesnesi de geçerli işlevi çağıran işlevin başvurusu niteliğindeki caller adında bir özellik içerirdi. caller özelliği ActionScript 3.0'da yoktur ancak çağıran işleve başvuru gerekiyorsa, çağıran işlevi, başvurunun kendisi olan fazladan bir parametreyi iletecek şekilde değiştirebilirsiniz.
... (rest) parametresi
ActionScript 3.0, ... (rest) parametresi adında yeni bir parametre içerir. Bu parametre, virgül sınırlı herhangi bir sayıda argümanı kabul eden bir dizi parametresi belirtmenize olanak sağlar. Parametre, ayrılmış sözcükler dışında herhangi bir ada sahip olabilir. Bu parametre bildiriminin belirtilen son parametre olması gerekir. Bu parametrenin kullanılması, arguments nesnesini kullanılamaz duruma getirir. ... (rest) parametresi, arguments dizisi ve arguments.length özelliğiyle aynı işlevselliği verse de, bu, arguments.callee tarafından sağlanan işlevselliğe benzer bir işlevsellik sağlamaz. ... (rest) parametresini kullanmadan önce arguments.callee öğesini kullanmadığınızdan emin olmanız gerekir.
Aşağıdaki örnek, arguments nesnesi yerine ... (rest) parametresini kullanarak traceArgArray() işlevini yeniden yazar:
function traceArgArray(... args):void
{
for (var i:uint = 0; i <>
... (rest) parametresi ayrıca listedeki son parametre olduğu sürece diğer parametrelerle de kullanılabilir. Aşağıdaki örnek, işlevin birinci parametresi (x) int türünde olacak ve ikinci parametre de ... (rest) parametresini kullanacak şekilde traceArgArray() işlevini değiştirir. Birinci parametre artık ... (rest) parametresi tarafından oluşturulan dizinin bölümü olmadığından, çıktı birinci değeri atlar.
function traceArgArray(x: int, ... args)
{
for (var i:uint = 0; i <>
1 yorum:
Bununla ilgili bir örnek varmı acaba
Yorum Gönder