Класическая задача, мне нужно построить обработчик, таковой, что обращаясь к нему, заложив параметры, можно было бы выбирать по индексу метод обработки. Можно построить дерево if-elseif-elseif-elseif-end но такое решение, возможно, не самое элегантное, хотел создать массив code, чтобы напрямую запускать функцию из массива, но это запрещено по причине указанный в комментариях в посте, там же можно найти обходное решение следуя которому, я написал этого монстра.
code vJass
library TestLib initializer TestINI

struct ExampleStruct
	static constant integer MARC_1 = 0
	static constant integer MARC_2 = 1
	static constant integer MARC_3 = 2
	static constant integer MARC_4 = 3
	static constant integer MARC_5 = 4
	//ets...
	//
	private static trigger array ACTIONTRIGGERS
	//
	private static integer GLOB_LOC_ADRESS
	private static string  GLOB_LOC_OUTPUT
	//
	private static method GetAction1 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+1)
		return true
	endmethod
	
	private static method GetAction2 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+2)
		return true
	endmethod
	
	private static method GetAction3 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+3)
		return true
	endmethod
	
	private static method GetAction4 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+4)
		return true
	endmethod
	
	private static method GetAction5 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+5)
		return true
	endmethod
	//etc...	

	static method GetOutput takes integer method, integer adress returns string
		set GLOB_LOC_ADRESS = adress
		if(TriggerEvaluate(ACTIONTRIGGERS[method]))then
			return GLOB_LOC_OUTPUT
		else
			return ""
		endif
	endmethod
	
	static method STRUCTINI takes nothing returns nothing
		set ACTIONTRIGGERS[MARC_1] = CreateTrigger()
		call TriggerAddCondition(ACTIONTRIGGERS[MARC_1],function s__ExampleStruct_GetAction1)
		//
		set ACTIONTRIGGERS[MARC_2] = CreateTrigger()
		call TriggerAddCondition(ACTIONTRIGGERS[MARC_2],function s__ExampleStruct_GetAction2)
		//
		set ACTIONTRIGGERS[MARC_3] = CreateTrigger()
		call TriggerAddCondition(ACTIONTRIGGERS[MARC_3],function s__ExampleStruct_GetAction3)
		//
		set ACTIONTRIGGERS[MARC_4] = CreateTrigger()
		call TriggerAddCondition(ACTIONTRIGGERS[MARC_4],function s__ExampleStruct_GetAction4)
		//
		set ACTIONTRIGGERS[MARC_5] = CreateTrigger()
		call TriggerAddCondition(ACTIONTRIGGERS[MARC_5],function s__ExampleStruct_GetAction5)
		//etc...
	endmethod

endstruct

function TestStructFunc takes nothing returns nothing
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_1,12))
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_2,12))
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_3,12))
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_4,12))
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_5,12))
endfunction

function TestINI takes nothing returns nothing
	call ExampleStruct.STRUCTINI()
	call TimerStart(CreateTimer(), 1, false, function TestStructFunc)
endfunction 

endlibrary
Мне кажется, что подобное решение нормальному человеку и показывать нельзя. Но может кто-то подскажет как сделать лучше
Переписано на
code vJass
library TestLib initializer TestINI

struct ExampleStruct
	static constant integer MARC_1 = 0
	static constant integer MARC_2 = 1
	static constant integer MARC_3 = 2
	static constant integer MARC_4 = 3
	static constant integer MARC_5 = 4
	//ets...
	//
	private static boolexpr array CodeAr
	//
	private static integer GLOB_LOC_ADRESS
	private static string  GLOB_LOC_OUTPUT
	//
	private static method GetAction1 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+1)
		return true
	endmethod
	
	private static method GetAction2 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+2)
		return true
	endmethod
	
	private static method GetAction3 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+3)
		return true
	endmethod
	
	private static method GetAction4 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+4)
		return true
	endmethod
	
	private static method GetAction5 takes nothing returns boolean
		set GLOB_LOC_OUTPUT = I2S(GLOB_LOC_ADRESS+5)
		return true
	endmethod
	//etc...	

	static method GetOutput takes integer method, integer adress returns string
		set GLOB_LOC_ADRESS = adress
		call ForceEnumPlayersCounted(bj_FORCE_PLAYER[0], CodeAr[method],1)
		return GLOB_LOC_OUTPUT
	endmethod
	
	static method STRUCTINI takes nothing returns nothing
		//
		set CodeAr[MARC_1] = Condition(function s__ExampleStruct_GetAction1)
		set CodeAr[MARC_2] = Condition(function s__ExampleStruct_GetAction2)
		set CodeAr[MARC_3] = Condition(function s__ExampleStruct_GetAction3)
		set CodeAr[MARC_4] = Condition(function s__ExampleStruct_GetAction4)
		set CodeAr[MARC_5] = Condition(function s__ExampleStruct_GetAction5)
		//etc...
	endmethod

endstruct

function TestStructFunc takes nothing returns nothing
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_1,12))
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_2,12))
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_3,12))
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_4,12))
	call BJDebugMsg(ExampleStruct.GetOutput(ExampleStruct.MARC_5,12))
endfunction

function TestINI takes nothing returns nothing
	call ExampleStruct.STRUCTINI()
	call TimerStart(CreateTimer(), 1, false, function TestStructFunc)
endfunction 

endlibrary

Koladik:
обработчик, таковой, что обращаясь к нему, заложив параметры, можно было бы выбирать по индексу метод обработки
Для jass такие решения уже есть, cjass добавляет лишь сахар, который легко изымается при необходимости

Koladik:
проверить точно, насколько доступ к lua таблицам быстрее чем к хэш-таблицам на жазе невозможно
Можно нагрузить пустую карту сравниваемыми операциями, и посмотреть, какие будут нагружать сильнее
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
26
Koladik:
а зачем?
Обоснованного на реальных цифрах, а не вере выбора реализации не достаточно?
это не вера, это здравый смысл
11
больше 256 таблиц.
Это, конечно, весомая причина, спору нет. Но я не уверен, что это серьезная преграда т.к. многие таблицы можно было бы объединить но да, тут начинаются костыли
18
Koladik:
обработчик, таковой, что обращаясь к нему, заложив параметры, можно было бы выбирать по индексу метод обработки
Для jass такие решения уже есть, cjass добавляет лишь сахар, который легко изымается при необходимости

Koladik:
проверить точно, насколько доступ к lua таблицам быстрее чем к хэш-таблицам на жазе невозможно
Можно нагрузить пустую карту сравниваемыми операциями, и посмотреть, какие будут нагружать сильнее
Принятый ответ
30
Но я не уверен, что это серьезная преграда т.к. многие таблицы можно было бы объединить но да, тут начинаются костыли
Только вот зачем заниматься костылеписанием, если разрабы предоставили нормальный ЯП, в котором можно комфортно работать. Чего только стоят замыкания, которые избавляют от муторного сохранения информации на id таймера.
11
Для jass такие решения уже есть, cjass добавляет лишь сахар, который легко изымается при необходимости
То что нужно, спасибо! Только немного переписать на vjass и дать сюда ссылку в случае чего.
NazarPunk:
нормальный ЯП, в котором можно комфортно работать
Лично мне пока недостаточно комфортно, но да, на луа, конечно, перспективнее писать.
30
То что нужно, спасибо! Только немного переписать на vjass и дать сюда ссылку в случае чего.
И нужно замерить производительно 100500 сохранённых функций и 100500 if/elseif. Оплимит не даст соврать. Которого кстати в lua нет)
32
Return bug и массив целочисленных не подходит?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.