Чтобы быть эффективной, функция должна быть детерминированной, т. е. выход должен быть только в зависимости от входа, так что результат может быть кэширован.
Если вы хотите вызвать хранимую процедуру из функции, вам нужно специально сделать функцию недетерминированной.
Если вы разделяете строку в Lua, вам следует попробовать методы string.gmatch () или string.sub () . Используйте метод string.sub (), если вы знаете индекс, по которому вы хотите разделить строку, или используйте string.gmatch (), если вы будете анализировать строку, чтобы найти место для разделения строки.
Пример использования string.gmatch () из Справочное руководство Lua 5.1 :
t = {}
s = "from=world, to=Lua"
for k, v in string.gmatch(s, "(%w+)=(%w+)") do
t[k] = v
end
Вот функция:
function split(pString, pPattern)
local Table = {} -- NOTE: use {n = 0} in Lua-5.0
local fpat = "(.-)" .. pPattern
local last_end = 1
local s, e, cap = pString:find(fpat, 1)
while s do
if s ~= 1 or cap ~= "" then
table.insert(Table,cap)
end
last_end = e+1
s, e, cap = pString:find(fpat, last_end)
end
if last_end <= #pString then
cap = pString:sub(last_end)
table.insert(Table, cap)
end
return Table
end
Назовите ее так:
list=split(string_to_split,pattern_to_match)
например:
list=split("1:2:3:4","\:")
Чтобы узнать больше, перейдите сюда:
http://lua-users.org/wiki/SplitJoin
Так же, как string.gmatch
найдет паттернов в строке, эта функция найдет вещи между паттернами:
function string:split(pat)
pat = pat or '%s+'
local st, g = 1, self:gmatch("()("..pat..")")
local function getter(segs, seps, sep, cap1, ...)
st = sep and seps + #sep
return self:sub(segs, (seps or 0) - 1), cap1 or sep, ...
end
return function() if st then return getter(st, g()) end end
end
По умолчанию возвращает все, что разделено пробелами.