Minecraft Wiki
Нет описания правки
(исправление последствий моей рассеянности)
 
Строка 37: Строка 37:
 
for i, t in ipairs(tables) do
 
for i, t in ipairs(tables) do
 
if type(t) == 'table' then
 
if type(t) == 'table' then
for k, v in pairs(tables) do
+
for k, v in pairs(t) do
 
if type(k) == 'number' then
 
if type(k) == 'number' then
 
table.insert(newt, v)
 
table.insert(newt, v)

Текущая версия от 18:42, 24 апреля 2019

Этот модуль включает в себя различные функции, которые могут использоваться в других модулях. Они либо не реализованы в стандартных библиотеках Lua/Scribunto, либо реализованы недостаточно эффективно.

local p = {}

-- Добавление именованных значений, с обработкой повторяющихся ключей
local function tryInsertKey(thetable, key, value, strict)
	local try = 1
	local inserted = false
	local _key = key
	repeat
		if thetable[_key] == nil then
			table.insert(thetable, _key, value)
			inserted = true
		else
			if strict then
				error("Ключ " .. key .. " встречается в нескольких таблицах при том, что их обработка здесь была запрещена.")
			else
				try = try + 1
				_key = key .. try
			end
		end
	until inserted
end

-- Объединяет несколько таблиц вместе.
function p.jointables(tables, strict)
	local newt = {}
	
	if #tables == 1 then
		return tables[1]
	elseif #tables == 0 then
		return {}
	end
	
	if strict == nil then
		strict = false
	end
	
	for i, t in ipairs(tables) do
		if type(t) == 'table' then
			for k, v in pairs(t) do
				if type(k) == 'number' then
					table.insert(newt, v)
				else
					tryInsertKey(newt, k, v, strict)
				end
			end
		else
			error("Среди таблиц обнаружен объект, таблицей не являющейся.")
		end
	end
	
	return newt
end