1

Тема: AHK: Передача функции, в качестве аргумента, другой функции.

Каким образом, можно организовать передачу функции в функцию? Отчасти, для функций без параметров, понятно как это сделать.
Например:


main("func1", "func2", 1)

main(f1, f2, select)
    {
    if(select = 1)
        %f1%()
    else
        %f2%()
    }

func1()
    {
    ToolTip % "функция 1"
    }

func2()
    {
    ToolTip % "функция 2"
    }

Esc::ExitApp

Как осуществить то же самое, но для функции с параметрами? Т.е. что-то вроде:

вызов:
main(функция #1(параметры), функция #2(параметры), выбор)

определение :
main(функция #1, функция #2, выбор)
    если выбор = 1
        выполнить функция #1(параметры функции 1)
    иначе
        выполнить функция #2(параметры функции 2)

Если не трудно, с примером.

2 (изменено: yalanne, 2015-08-25 22:15:34)

Re: AHK: Передача функции, в качестве аргумента, другой функции.

Вот вариант, но параметры будут что у первой, что у второй одинаковы.

main("func1", "func2", 1,    "test1","test2","test3")

main(f1, f2, select, parameters*)
    {
    if(select = 1)
        %f1%(parameters*)
    else
        %f2%(parameters*)
    }

func1(parameters*)
    {
    msgbox % "Функция " A_ThisFunc "`nПереданно параметров " parameters.MaxIndex()
    msgbox % parameters.1 "`n" parameters.3
    }

func2(parameters*)
    {
    msgbox % "Функция " A_ThisFunc "`nПереданно параметров " parameters.MaxIndex()
    msgbox % parameters.2
    }
    
Esc::ExitApp

А какова цель что бы у первой и второй функции была общая переменная, но что бы эта переменная не была глобальная?
Если да то можно вот так через класс сделать

Class Main
{
    F1(p1,p2)
    {
        msgbox % "Имя функции: " A_ThisFunc "`n`nпереданные параметры этой функции: `n`t'" p1 "'`n`t'" p2 "'`n`nОбщая переменная: `n`t'" this.VarStatic "'"
    }
    
    F2(p1,p2)
    {
        msgbox % "Имя функции: " A_ThisFunc "`n`nпереданные параметры этой функции: `n`t'" p1 "'`n`t'" p2 "'`n`nОбщая переменная: `n`t'" this.VarStatic "'"
    }
}

Main := new Main
Main.VarStatic := "Эта переменная общая для main класса и его функций"

Main.F1("Первый параметр для первой функции","Второй параметр для первой функции")
Main.F2("Первый параметр для второй функции","Второй параметр для второй функции")

3

Re: AHK: Передача функции, в качестве аргумента, другой функции.

main(Func("MyFunc1").Bind("test1", "test2"), Func("MyFunc2").Bind("test3", "test4"), 1)

main(f1, f2, select)
{
   if (select = 1)
      f1.Call()
   else
      f2.Call()
}

MyFunc1(param1, param2)
{
   MsgBox,, % A_ThisFunc, % param1 "`n" param2
}

MyFunc2(param1, param2)
{
   MsgBox,, % A_ThisFunc, % param1 "`n" param2
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: Stremin, 2015-08-28 19:10:31)

Re: AHK: Передача функции, в качестве аргумента, другой функции.

yalanne, teadrinker
Спасибо вам за помощь. Уже после создания темы, справился сам, сделал так:


main("func1", ["param1", "param2"], "func2", ["param3", "param4"], 2)

main(f1, p1, f2, p2, select)
    {
    if(select = 1)
        %f1%(p1*)
    else
        %f2%(p2*)
    }

func1(a, b)
    {
    ToolTip % format("Функция : {}, её параметры : {}, {}", A_ThisFunc, b, a)
    }

func2(a, b)
    {
    ToolTip % format("Функция : {}, её параметры : {}, {}", A_ThisFunc, b, a)
    }

yalanne Цель была следующая: есть некий код (функция main для примера), фрагмент которого, может быть произвольным (функцией или меткой).

teadrinker Ваш вариант в чём-то даже удобнее, т.к. у функции меньше аргументов (3 против 5).

5

Re: AHK: Передача функции, в качестве аргумента, другой функции.

Stremin пишет:
main("func1", ["param1", "param2"], "func2", ["param3", "param4"], 2)

main(f1, p1, f2, p2, select)
    {
    if(select = 1)
        %f1%(p1*)
    else
        %f2%(p2*)
    }

Ненужное усложнение: достаточно же main(f1, p1), ведь судя по коду по цепи будет вызываться только одна функция - либо первая, либо вторая.
А ещё полезно добавлять safe check проверки IsFunc(f1)/IsLabel(f1) и IsObj(p1).

6 (изменено: serzh82saratov, 2015-08-29 17:11:22)

Re: AHK: Передача функции, в качестве аргумента, другой функции.

Я например не понял зачем в принципе функция main, и параметр select.
Вызов можно осуществить просто по индексу из массива функций:


fn := [Func("MyFunc1").Bind("test1", "test2"), Func("MyFunc2").Bind("test3"), Func("MyFunc3")]

Loop % fn.MaxIndex()
    fn[A_Index].Call() 
  
MyFunc1(param1, param2)
{
   MsgBox,, % A_ThisFunc, % param1 "`n" param2
}

MyFunc2(param1)
{
   MsgBox,, % A_ThisFunc, % param1 
}

MyFunc3()
{
   MsgBox % A_ThisFunc
}
+ Можно добавить ещё свои параметры, даже если какая то из функций их не должна принимать:

fn := [Func("MyFunc1").Bind("test1", "test2"), Func("MyFunc2").Bind("test3"), Func("MyFunc3")]

Loop % fn.MaxIndex()
    fn[A_Index].Call("test4", "test5")
  
MyFunc1(param1, param2, param3, param4)
{
   MsgBox,, % A_ThisFunc, % param1 "`n" param2 "`n" param3 "`n" param4
}

MyFunc2(param1)
{
   MsgBox,, % A_ThisFunc, % param1 
}

MyFunc3()
{
   MsgBox % A_ThisFunc
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui