Небольшой вопросик

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Zeppelin
Posts: 30
Joined: 2008-08-11 21:52:22

Небольшой вопросик

Post by Zeppelin »

Хм, а имеется ли возможность создавать указатели на функции, то есть например сделать переменную или массив, элементы которого - сабы моего скрипта, и обращаться, например не

Code: Select all

Walk(x,y)

а, наподобии этого -

Code: Select all

var Function = Walk()
Function(x,y)

Перепробовал много всего, но так и не получилось..
Beyonder
Expert!
Posts: 388
Joined: 2005-04-23 10:19:43
Contact:

Re: Небольшой вопросик

Post by Beyonder »

О да, конечно :)
Если что, то это был сарказм.

Вижу два способа это сделать.

Первый. Более эстетично выглядящий, и вероятно подойдёт в 99% случаев:

Code: Select all

sub selectFunction(name,param1,param2,param3)
        if (name == 'funct1') then
                return funct1(param1,param2,param3)
        endif
        if (name == 'funct2') then
                return funct2(param1,param2,param3)
        endif
        if (name == 'funct3') then
                return funct3(param1,param2,param3)
        endif
endsub

sub...
var funct = 'funct1'
selectFunction(funct,1,2,3)
endsub


Второй. Всё работает через задницу, зато позволяет добавлять любое количество функций не изменяя кода:

Code: Select all

Sub func1()
        var param1 = UO.GetGlobal('param1')
        var param2 = UO.GetGlobal('param2')
        var param3 = UO.GetGlobal('param3')
...
endsub

Sub callFunc(name,param1,param2,param3)
        UO.SetGlobal('param1',param1)
        UO.SetGlobal('param2',param2)
        UO.SetGlobal('param3',param3)
        UO.Exec('exec '+name)
endsub

sub...
        var func = 'func1'
        callFunc(func,1,2,3)
endsub
Zeppelin
Posts: 30
Joined: 2008-08-11 21:52:22

Re: Небольшой вопросик

Post by Zeppelin »

Beyonder wrote:О да, конечно :)
Если что, то это был сарказм.

Вижу два способа это сделать.

Первый. Более эстетично выглядящий, и вероятно подойдёт в 99% случаев:

Code: Select all

sub selectFunction(name,param1,param2,param3)
        if (name == 'funct1') then
                return funct1(param1,param2,param3)
        endif
        if (name == 'funct2') then
                return funct2(param1,param2,param3)
        endif
        if (name == 'funct3') then
                return funct3(param1,param2,param3)
        endif
endsub

sub...
var funct = 'funct1'
selectFunction(funct,1,2,3)
endsub


Второй. Всё работает через задницу, зато позволяет добавлять любое количество функций не изменяя кода:

Code: Select all

Sub func1()
        var param1 = UO.GetGlobal('param1')
        var param2 = UO.GetGlobal('param2')
        var param3 = UO.GetGlobal('param3')
...
endsub

Sub callFunc(name,param1,param2,param3)
        UO.SetGlobal('param1',param1)
        UO.SetGlobal('param2',param2)
        UO.SetGlobal('param3',param3)
        UO.Exec('exec '+name)
endsub

sub...
        var func = 'func1'
        callFunc(func,1,2,3)
endsub

Ага, спасибо, жаль что нельзя, надо Yoko учесть это в следующем релизе, как и вообще - указатели как таковые..
На данный момент у меня как в первом варианте. :) Но душа не спокойна при виде одинаковых кусков кода, у меня там аж 7 функций :)
Ах да, кстати - эти мои 7 функций - эмуляция работы с глобальными массивами :) Это тоже неплохо бы добавить в следующий релиз (глобальные массивы, то бишь).
Beyonder
Expert!
Posts: 388
Joined: 2005-04-23 10:19:43
Contact:

Re: Небольшой вопросик

Post by Beyonder »

Ну в данный момент состояние инжекта таково, что он лежит еще не совсем мёртвый и слегка подрыгивает ножками. Так что не думаю что такие глобальные изменения найдут своего программиста :)
Zeppelin
Posts: 30
Joined: 2008-08-11 21:52:22

Re: Небольшой вопросик

Post by Zeppelin »

Beyonder wrote:Ну в данный момент состояние инжекта таково, что он лежит еще не совсем мёртвый и слегка подрыгивает ножками. Так что не думаю что такие глобальные изменения найдут своего программиста :)

:(
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Небольшой вопросик

Post by Mirage »

МБ я не понял запроса но чем не устраивает:

Code: Select all

sub main()
test(10, 20, 'действие')
endsub
Sub test(1, 2, действие)
for x = 1 to 2
test2('действие')
next
endsub
Zeppelin
Posts: 30
Joined: 2008-08-11 21:52:22

Re: Небольшой вопросик

Post by Zeppelin »

Mirage wrote:МБ я не понял запроса но чем не устраивает:

Code: Select all

sub main()
test(10, 20, 'действие')
endsub
Sub test(1, 2, действие)
for x = 1 to 2
test2('действие')
next
endsub

Мне было интересно, можно ли каким-то образом реализовать нечто подобное:

Code: Select all

Sub Func1(index)
   return index+1
end sub

Sub Func2(index)
   return index+2
end sub

Sub Func3(index)
   return index+3
end sub

Sub Func4(index)
   return index+4
end sub

sub Calculate()
   var i
   DIM Function[4]
   Function[0] = Func1()
   Function[1] = Func2()
   Function[2] = Func3()
   Function[3] = Func4()
   for i = 0 to 3
      uo.print(str(Function[i](1)))
   next
end sub


То есть массив указателей на функции, чтобы вызывать их не по именам сабов, а по указателям.. Но, как мне сказали, нельзя :)
Post Reply