Форум 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=175508)

MikroAcse 18.02.2012 21:45

Как передать переменную в функцию?
 
Уже просмотрел 3 темы, 2 записи, 4 сайта - ничего не нашел!

Например, есть функция:
Код AS3:

function blabla(){
 
}

Как мне передать в нее переменную.
Читал что надо использовать apply() , но так и не понял как ним пользоваться.

Добавлено через 33 секунды
И вообще, это возможно?

КорДум 18.02.2012 21:48

Что для Вас есть "переменная"?
Код AS3:

private function foo(param:uint, str:String, obj:Object):void

Передавайте: foo(1, "123", { });

MikroAcse 18.02.2012 21:54

Хм... ну как же объяснить?
Добавлено через 1 секунду
Вот, например:
Код AS3:

public static function repeatFunction(countsOfRepeat:Number,functionToRepeat:Function){
                        for(var iR=0;iR<countsOfRepeat;iR++){
                                var newfunctionToRepeat:Function=functionToRepeat;
                                newfunctionToRepeat.apply(null, [iR]);
                                newfunctionToRepeat();
                        }
                }

Вызываю:
Код AS3:

import mClasses.mUtils.*
 
MSomeUtils.repeatFunction(10,traceIt)
 
function traceIt(){
 
}

Ошибка:
Цитата:

ArgumentError: Error #1063: Несоответствие количества аргументов в libtest_fla::MainTimeline/traceIt(). Ожидалось 0, получено 1.
at Function/http://adobe.com/AS3/2006/builtin::apply()
at mClasses.mUtils::MSomeUtils$/repeatFunction()
at libtest_fla::MainTimeline/frame1()
Теперь как правильно этим пользоваться?

КорДум 18.02.2012 21:55

Зачем такие извращения?
Код AS3:

functionToRepeat(null, Array(iR));


MikroAcse 18.02.2012 21:56

Ой не то, исправил.

КорДум 18.02.2012 21:57

Мой ответ от этого не шибко изменится.

СлаваRa 18.02.2012 22:10

У вас функция приемник, ничего не принимает, а вы пытаетесь запихать в нее массив, поэтому вылетает ошибка.
А можете объяснить ход вашей мысли, когда вы писали вот этот блок кода?
Код AS3:

var newfunctionToRepeat:Function=functionToRepeat;
newfunctionToRepeat.apply(null, [iR]);
newfunctionToRepeat();

почитайте внимательно:
Function.#apply()
Function#call()

MikroAcse 18.02.2012 22:11

Все, решил проблему.
Код AS3:

public static function repeatFunction(countsOfRepeat:Number,functionToRepeat:Function){
                        var newfunctionToRepeat:Function=functionToRepeat;
                        var arrayOfFunction:Array=[]
                        for(var iR=0;iR<countsOfRepeat;iR++){
                                arrayOfFunction=new Array(newfunctionToRepeat.length)
                                arrayOfFunction[newfunctionToRepeat.length-1]=iR
                                newfunctionToRepeat.apply(null, arrayOfFunction);
                        }
                }

Вызываю:
Код AS3:

import mClasses.mUtils.*
 
MSomeUtils.repeatFunction(10,traceIt)
 
 
function traceIt(tra:Number,bla:Number){
  trace(bla)
  /*
0
1
2
3
4
5
6
7
8
9
*/

 
}


Silicium 18.02.2012 22:13

Код:

А можете объяснить ход вашей мысли
И все-таки? Меня тоже интересует. Сами ведь фанат простоты)

КорДум 18.02.2012 22:17

Великий Мук, пожалуйста, почините пробел у себя на клавиатуре.
Код AS3:

repeatFunction(10, trace, [1, 2, 3]);
 
public static function repeatFunction(count:uint, foo:Function, params:Array):void {
        for (var i:uint = 0; i < count; i++)
                foo.apply(null, params);
}

Добавлено через 5 минут
Код AS3:

repeatFunction(10, trace, 1, 2, 3);
 
public static function repeatFunction(count:uint, foo:Function, ...params):void {
        for (var i:uint = 0; i < count; i++)
                foo.apply(null, params);
}

А так кошернее. Только я не могу придумать ни одного случая, где бы пригодилась Ваша функция. Ну да ладно.

MikroAcse 18.02.2012 23:01

Мне в моих проектах часто надо вызывать for(...)
Вот я и сделал такую штукенцию.
Она выполняет мою функцию столько раз, сколько мне надо.

ChuwY 19.02.2012 06:04

Вы сделали ад, в который можно въехать только в пятницу вечером.
Возьмите вариант кордума.

FlashRus 19.02.2012 06:17

Цитата:

Мне в моих проектах часто надо вызывать for(...)
часто в таких случая требуется обратиться к текущему значению индексной переменной.
Ваша функция этого не позволяет.

MikroAcse 19.02.2012 14:18

Почему это?
Как раз таки могу.
Код AS3:

repeatFunction(11, myfunction)
 
function myfunction(number:Number){
trace(number)
}

Вот именно number и есть текущий индекс.

Zebestov 19.02.2012 14:30

Мракобесие — вольный перевод на русский язык термина «обскурантизм» (латинское obscurans — «затемняющий»), означающего идейное настроение, враждебное по отношению к науке, культуре и личной свободе.

MikroAcse 19.02.2012 14:48

Что ты имеешь ввиду?

HardCoder 19.02.2012 15:48

Как вам такой вариант:
Код AS3:

/**
 * Перебор элементов массива
 * @param        array - массив
 * @param        func - функция-обработчик для каждого элемента массива конструкции function foo(array:Array, index:uint);
 * @param        startIndex - начальный индекс итерации. По умолчанию первый элемент массива включительно.
 * @param        endIndex - конечный индекс итерации. По умолчанию последний элемент массива включительно.
 */

public static function arrayIterate(array:Array, func:Function, startIndex:uint = 0, endIndex:uint = uint.MAX_VALUE):void {
        if (!array.length)
                throw new ArgumentError("Переданный масив не содержит ни одного элемента!");
        if (startIndex >= array.length)
                throw new ArgumentError("Начальный индекс итерации " + startIndex + " выходит за допустимые пределы: 0 - " + (array.length - 1) + "!");
        if (endIndex == uint.MAX_VALUE)
                endIndex = array.length - 1;
        if (endIndex >= array.length)
                throw new ArgumentError("Конечный индекс итерации " + endIndex + " выходит за допустимые пределы: 0 - " + (array.length - 1) + "!");
        for (var i:uint = startIndex; i <= endIndex; i++)
                func(array, i);               
}

Код AS3:

var ar:Array = new Array("23", "44", "39");
ArrayUtil.arrayIterate(ar, array1Handler, 0, 0);// 23
ArrayUtil.arrayIterate(ar, array1Handler, 0, 1);// 23, 44
ArrayUtil.arrayIterate(ar, array1Handler, 1, 2);// 44, 39
ArrayUtil.arrayIterate(ar, array1Handler, 2, 2);// 39
ArrayUtil.arrayIterate(ar, array1Handler, 1);  // 44, 39
ArrayUtil.arrayIterate(ar, array1Handler, 2);  // 39
ArrayUtil.arrayIterate(ar, array1Handler);      // 23, 44, 39
 
private function array1Handler(array:Array, index:uint):void {
        trace(array[index]);
}


MikroAcse 19.02.2012 16:05

Код AS3:

Как вам такой вариант

Спасибо за такую прикольную штуку.
Буду держать как заметку :)

FlashRus 19.02.2012 17:48

Цитата:

Сообщение от MikroAcse (Сообщение 1063946)
Почему это?
Как раз таки могу.
Код AS3:

repeatFunction(11, myfunction)
 
function myfunction(number:Number){
trace(number)
}

Вот именно number и есть текущий индекс.

Это не индексная переменная. Это параметр.

Я имею ввиду счётчик в цикле. Кароче говоря, переменную i

MikroAcse 19.02.2012 17:51

Я тебя наверное не понимаю :)
Код AS3:

repeatFunction(11, myfunction)
 
function myfunction(number:Number){
trace(number)
}

Выдает:
Цитата:

1
2
3
4
5
6
7
8
9
10

FlashRus 19.02.2012 17:58

ладно, всё ясно.
По мне так проще цикл написать. Он хотя бы гибкий.
Здесь же нет никакой возможности сделать шаг более одного или к примеру начать выполнение цикла с определённого значения.

MikroAcse 19.02.2012 18:02

Ну я ведь над ним еще мало работал :)

HardCoder 19.02.2012 18:27

Цитата:

Сообщение от MikroAcse (Сообщение 1063979)
Ну я ведь над ним еще мало работал :)

Так вот же рабочий, пример. Что там еще можно изменять, дорабатывать, или как его можно по другому написать? На счет шага инкрементирования, то вместо i++ можно подставить другое выражение и число, передаваемое в параметры метода. Я, конечно, таким не пользуюсь, просто прочитав этот топик, решил потарабанить по клаве - как говорится "муза посетила"...

Добавлено через 4 минуты
Да и гибкости вы не добьетесь никак, если проходится по двумерному массиву... Лучше уж вручную написать

MikroAcse 19.02.2012 18:33

Цитата:

Так вот же рабочий, пример
Я в нем ничего не понимаю

FlashRus 19.02.2012 20:17

что там непонятного? Пройдитесь самостоятельно по командам хотя бы пару циклов и всё станет ясно.

carrotoff 19.02.2012 20:18

MikroAcse, вы стали моим любимым пользователем форума! Столько позитива!

FlashRus 19.02.2012 20:27

MikroAcse, порешайте такие задачи http://kufas.ru/programming190.htm
буде полезно.
серьёзно.


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

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