Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Передача неопределенного количества аргументов (http://www.flasher.ru/forum/showthread.php?t=105629)

Amra Kimmerian 19.12.2007 17:58

Передача неопределенного количества аргументов
 
Здравствуйте.
Как обработать в функции неопределенное количество аргументов - понятно (The ... (rest) parameter).
А как передать в ф-ию неопределенное количество аргументов? Судя по хелпу эти аргументы составляют внутри нее массив:
Цитата:

This parameter allows you to specify an array parameter that accepts any number of comma- delimited arguments.
Пробовал создать и массив, и объект чтобы в качестве аргумента ф-ии указать его, но выдает ошибку. А необходимо передать в ф-ию заранее неизвестное количество аргументов.
Можно ли как то это сделать?

VovkaMorkovka 19.12.2007 18:47

Код:

function f(a:int=0,b:int=0)

etc 19.12.2007 18:52

Там же есть наглядный пример. В чем проблема?

K.A.T.A.F.A.L.K.E.R 19.12.2007 20:09

Код:

function test(...listofarguments){
        trace(listofarguments);
}
test(1,2,3)

в хелпе примеры действительно есть...

Amra Kimmerian 20.12.2007 08:35

2 VovkaMorkovka. a и b - это не неопределенное количество аргументов, их число равно двум.

2 __etc. Да есть, даже два и в обоих вызов ф-ии такой:
Код:

traceArgArray(1, 2, 3);
Проблема в том что 1, 2 и 3 это последовательность из 3-х аргументов, но никак не неопределенное их количество.

2 K.A.T.A.F.A.L.K.E.R . Опять же вызов ф-ии:
Код:

test(1,2,3)
с однозначно определенным количеством аргументов - тремя.

Повторюсь: проблема не в том чтобы обработать в функции неопределенное количество аргументов, а проблема в том чтобы подать в ф-ию неопределенное количество аргуметов. Что то типа этого:
Код:

// создаем массив с объектами
var maxArgs:Number = 3;
var argsArray:Array = new Array();
for (var i:Number=0; i<maxArgs; i++) {
        var object:Object = new Object();
        argsArray[i]=object;
}
trace ("array all: "+argsArray); // array all: [object Object],[object Object],[object Object]
function traceArgArray(... args):void
{
    for (var i:uint = 0; i < args.length; i++)
    {
        trace("element "+i+" "+args[i]);
    }
}
// передаем массив в функцию
traceArgArray(argsArray); // element 0 [object Object],[object Object],[object Object]

Но, как видно, это не работает - переданный массив принимается как один первый аргумент (было бы ужасно если бы не так :) ).
Я не нашел в хелпе, как это можно сделать. Или я не вижу очевидного.

miramax 20.12.2007 09:22

Код:

traceArgArray.apply(this, argsArray)
Подойдёт ?
Вобще почитайте в хелпе про класс функции, полезно.

Amra Kimmerian 20.12.2007 09:54

Да! То что нужно. Обязательно почитаю. Спасибо miramax. Спасибо всем.

2morrowMan 20.12.2007 10:26

Цитата:

traceArgArray(argsArray);
Amra Kimmerian, ты говориш об передаче и обработке неопределенного количества аргументов, а сам же в своем примере передаеш только 1. Т.е. ты сам додумался как передать нужное количество аргументов(т.е. просто передать масив), не используя стандартного func(... args).

Amra Kimmerian 20.12.2007 10:46

Да, 2morrowMan, так то оно так, но хотелось внутри ф-ии использовать именно "... args", потому как имею дело с большым проектом, в котором уже так написано и менять что то в нем хочется по минимуму.

2morrowMan 20.12.2007 18:12

Цитата:

Сообщение от Amra Kimmerian
Да, 2morrowMan, так то оно так, но хотелось внутри ф-ии использовать именно "... args", потому как имею дело с большым проектом, в котором уже так написано и менять что то в нем хочется по минимуму.

Код:

function myFunc(... args):void {}
Это значит что ты можешь вызывать функцию myFunc() следующим образом:

1) myFunc();
2) myFunc(myParam);
3) myFunc(myParam1, myParam2, myParam3);
4) myFunc(myParam1, myParam2, myParam3, ..., myParamN);

где myParam может принимать любой тип(int, Number, String, Object и т.д.)


Вот так можно просмотреть переданные параметры:
Код:

function myFunc(... args):void
{
  for (var i:uint = 0; i < args.length; i++) trace(args[i]);
  // или
  // for each(var arg:* in args) trace(arg);
}



Часовой пояс GMT +4, время: 07:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.