PDA

Просмотр полной версии : Как передать переменную в функцию?


MikroAcse
18.02.2012, 21:45
Уже просмотрел 3 темы, 2 записи, 4 сайта - ничего не нашел!

Например, есть функция:
function blabla(){

}

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

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

КорДум
18.02.2012, 21:48
Что для Вас есть "переменная"?
private function foo(param:uint, str:String, obj:Object):void
Передавайте: foo(1, "123", { });

MikroAcse
18.02.2012, 21:54
Хм... ну как же объяснить?
Добавлено через 1 секунду
Вот, например:
public static function repeatFunction(countsOfRepeat:Number,functionToRepeat:Function){
for(var iR=0;iR<countsOfRepeat;iR++){
var newfunctionToRepeat:Function=functionToRepeat;
newfunctionToRepeat.apply(null, [iR]);
newfunctionToRepeat();
}
}

Вызываю:
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
Зачем такие извращения?
functionToRepeat(null, Array(iR));

MikroAcse
18.02.2012, 21:56
Ой не то, исправил.

КорДум
18.02.2012, 21:57
Мой ответ от этого не шибко изменится.

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

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


почитайте внимательно:
Function.#apply() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Function.html#apply())
Function#call() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/Function.html#call())

MikroAcse
18.02.2012, 22:11
Все, решил проблему.
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);
}
}

Вызываю:
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
Великий Мук, пожалуйста, почините пробел у себя на клавиатуре.
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 минут
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
Почему это?
Как раз таки могу.
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
Как вам такой вариант:/**
* Перебор элементов массива
* @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);
}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
Как вам такой вариант
Спасибо за такую прикольную штуку.
Буду держать как заметку :)

FlashRus
19.02.2012, 17:48
Почему это?
Как раз таки могу.
repeatFunction(11, myfunction)

function myfunction(number:Number){
trace(number)
}

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

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

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

MikroAcse
19.02.2012, 17:51
Я тебя наверное не понимаю :)
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
Ну я ведь над ним еще мало работал :)
Так вот (http://www.flasher.ru/forum/showpost.php?p=1063963&postcount=17) же рабочий, пример. Что там еще можно изменять, дорабатывать, или как его можно по другому написать? На счет шага инкрементирования, то вместо 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
буде полезно.
серьёзно.