Есть ли в Lua способ запустить все функции указанной таблицы?
test = { }

test.a = 123
test.b = true

function test.func0( )
end

function test.func1( )
end

function test.qab( )
end
Нужно сделать так, чтобы все функции test.func0( ), test.func1( ), test.qab( ) были запущены. При этом заранее не известно количество функций.

Принятый ответ

ScopteRectuS:
Предполагаю, что делается через какой-то цикл перебором всех элементов таблицы, если элемент является функцией, то запустить.
Правильно предполагаете, но мануалы же никому неинтересны, проже же вопрос задать.
test   = { }
test.a = 123
test.b = true
function test.func0()
	print(0)
end
function test.func1()
	print(1)
end
function test.qab()
	print(2)
end

for k, v in pairs(test) do
	if type(v) == 'function' then
		print(k, ':')
		v()
	end
end
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
5 лет назад
0
Предполагаю, что делается через какой-то цикл перебором всех элементов таблицы, если элемент является функцией, то запустить.
1
29
5 лет назад
1
ScopteRectuS:
Предполагаю, что делается через какой-то цикл перебором всех элементов таблицы, если элемент является функцией, то запустить.
Правильно предполагаете, но мануалы же никому неинтересны, проже же вопрос задать.
test   = { }
test.a = 123
test.b = true
function test.func0()
	print(0)
end
function test.func1()
	print(1)
end
function test.qab()
	print(2)
end

for k, v in pairs(test) do
	if type(v) == 'function' then
		print(k, ':')
		v()
	end
end
Принятый ответ
0
21
5 лет назад
0
NazarPunk, простите за наглость. А как еще получить название функции?
1
29
5 лет назад
1
А как еще получить название функции?
На код внимательно посмотреть))
Загруженные файлы
0
21
5 лет назад
0
NazarPunk, v - это сам объект, а k - имя?
NazarPunk:
На код внимательно посмотреть))
Я код не запускал, поэтому такой вопрос получился)
0
29
5 лет назад
0
v - это сам объект, а k - имя?
Это сокращённо от key, value.
3
24
5 лет назад
3
ScopteRectuS, в k в этом коде попадает ключ по которому что-то лежит в таблице. В общем случае - ключ не обязательно строка.
0
21
5 лет назад
0
Нет, я понимаю, что это переменная. Я имел ввиду то, что в ней хранится.
Сейчас уже всё понял. Спасибо.
Написал свой код, но не работает. Почему?
Ability = { }
Ability.DeathCoil = { }

function Ability.DeathCoil.init( )
    print( 321 )
end

function InitAllAbilities( )
    for parentKey, parentValue in pairs( Ability ) do

        if type( parentValue ) == "table" then

            for childKey, chilValue in pairs( parentValue ) do
                if type( childValue ) == "function" and childKey == "init" then
                    childValue( )
                end
            end

        end
    end
end

InitAllAbilities( )
3
24
5 лет назад
Отредактирован prog
3
ScopteRectuS, Зачем так сложно то?

Ability = { }
Ability.DeathCoil = { }

function Ability.DeathCoil.init( )
    print( 321 )
end

function InitAllAbilities( )
    for parentKey, parentValue in pairs( Ability ) do
        if (type( parentValue ) == "table") then
			if(parentValue.init and type( parentValue.init ) == "function" ) then
				parentValue.init()
			end
       end
    end
end

InitAllAbilities( ) -- Этот вызов лучше бы перенести куда-то после инициализации карты, иначе будут проблемы.
Более того, я бы и от проверок на table и function избавился бы, условившись с самим собой что в таблице Ability могут лежать только таблицы спелов, а в таблицах спелов init либо функция либо его нет.
Ну и самое важное - я бы ключами в таблице Ability взял равкоды абилок, чтобы по равкоду абилки можно было сразу получить доступ к связанной с этим равкодом таблице.
Как-то так
	Ability = {}
	local DeathCoil = {}
	Ability[FourCC('A000')] = DeathCoil

	function DeathCoil.init( )
	...
	end
	
	function DeathCoil.cast( )
	...
	end
	...
	
function SomeTriggerAction()
	local spellId = GetSpellAbilityId()
	if(	Ability[spellId]) then
		if(Ability[spellId].cast)then
			Ability[spellId].cast()
		end
	end
end
...
А при желании можно еще и параметры в cast передавать.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.