Иван
прочитал, вернёт собственно удалённый элемент
Иван
ну да, пригодится, если его перемещать, например
Иван
там ошибка у тебя, cmpnt где?
if(component.id == types[i].id)
Tverd
и это, сначала сделай local types = self._.... , а потом уже if
Tverd
ага, норм
Иван
Шесть обращений к полю таблицы дороже, чем три + создание локальной переменной?
Иван
Или это только для читаемости?
Tverd
ну смотрится лучше однозначно ) а насчет скорости - не видел разницы, пробовал и так и так...
Иван
Ну ок, спасибо :)
Tverd
пожалуйста ) люблю когда код красивый
Иван
Кстати, а нужна ли эта проверка перед циклом: if(types) then for i = 1, #types do ? А то вдруг #nil возвращает 0, и тогда можно этот иф убрать.
Tverd
дык проверь )
Tverd
кстати, а как код писать? тэги?
Иван
Три `
Иван
в начале и в конце
Tverd
print()
Tverd
отлично, спасибо
Иван
Исключение кидает. Ну значит придётся с условием.
Tverd
так вот тож )
Tverd
Уважаемые, а кто нить рисует в чем нить сцены?
Tverd
string.split = function(self, sep, result) if sep == nil then sep = ' ' end if result == nil then result = { } end local cur, idx = 1, #result + 1 local s1 = self:find(sep, cur, true) while s1 do result[idx] = self:sub(cur, s1 - 1) cur = s1 + 1 s1 = self:find(sep, cur, true) idx = idx + 1 end result[idx] = self:sub(cur) return result end
Tverd
Подарок вам )
🦥Alex Fails
О, тут как раз кто-то искал такую вещь
Yogurt
sep = sep or ' '
Tverd
самая быстрая реализация, что сделал... Но разбивает по одному символу
Tverd
sep = sep or ' '
согласен, это компиляция с мунскрипта
Yogurt
А, понятно
Tverd
можно подукрасить )
Tverd
есть вариант и для нескольких символов
Tverd
если надо кому
Snusmumriken
Хм. Всю дорогу использовал: for line in (str..delm):gmatch('(.-)'..delm) do ... end Тут конечно лишняя нагрузка на сборку мусора, и если сплитить огромные объемы - можно не добавлять к строке разделитель, обрабатывая последнее найденное отдельно. Но это самый короткий вариант. Так - да, find и sub работают реально быстро.
Tverd
ну надо подумать над итератором... У меня есть недописаная либа с итераторами...
Tverd
если огромные объемы, а нужно несколько элементов - итераторы смогут облегчить работу
Snusmumriken
Можно объединить и эти два метода: strings.find возвращает два аргумента: начало и конец того что нашел, в результате - регулярка вида '(.-)'.. delimiter, после запихивания в string.find, выдает обе границы того что нашел. Можно смело sub'ать, отсекая с конца длину разделителя.
Tverd
Попробуй, очень интересно
Snusmumriken
Последний элемент тоже придется обрабатывать отдельно, но это не сложно, как раз если запоминать предыдущие значения.
Tverd
да, щас скину мультипоиск
Tverd
-- This split multiple separators string.split_multi = ( sep = ' ', result = {} ) => cur, idx = 1, #result + 1 patt = ('([^%s]+)')\format(sep) str = @match(patt, cur) while str result[idx] = str cur = cur + str\len() + 1 str = @match(patt, cur) idx += 1 result
Snusmumriken
Это на мунскрипте?
Tverd
я-я
Snusmumriken
Хмм
Snusmumriken
я-я
Как раз твой вариант адаптировал в сторону итератора, и добавил возможность произвольного размера разделителя.
Tverd
а скинь код плиз, потестю
Snusmumriken
function splitb(str, sep, result) sep = sep or ',' seplen = #sep result = result or {} local cur, i = 1, 0 local s1 = str:find(sep, cur, true) local lastflag = false return function() i = i + 1 if lastflag then return nil end if not s1 then lastflag = true; return i, str:sub(cur) end local part = str:sub(cur, s1 - 1) cur = s1 + seplen s1, s2 = str:find(sep, cur, true) return i, part end end
Tverd
ага, гуд
Snusmumriken
Флаг последнего участка - дабы корректно обрабатывать хвост. Можно было бы к оригинальной строке добавить разделитель в хвост, но если строка весит 3гб - это означает засирание памяти на 3гб, и тут же удаление из памяти тех же 3гб.
Tverd
Не понял что идет в sep? стринг или тейбл?
Snusmumriken
sep - разделитель, строка же.
Snusmumriken
separator
Tverd
#sep что даст?
Snusmumriken
Длину разделителя. Разделитель '!! !!'? Его длина - пять символов.
Tverd
sep:len()
Snusmumriken
Да, так тоже можно.
Tverd
о как... решетка дает длину строки? хм
Snusmumriken
Решётка - дёргает метаметод __len у каждого объекта, который имеет мета-таблицу. Строки её имеют, там в __index - таблица string, и набор метаметодов для конкатенации и прочей фигни.
Tverd
пипец... когда это появилось? я все пропустил ))))))))))))
Tverd
result не используется у тебя
Snusmumriken
А ещё, смотри, ты можешь сделать так: arr = setmatatable({}, {__index = table}) и после этого сразу: arr:insert(value) arr:remove(value) arr:sort() Строки используют аналогичный механизм.
Snusmumriken
Кстати да, не успел вычистить.
Tverd
не, насчет метатаблиц я в курсах... я просто не помню что бы в 5.1 __len работал
Snusmumriken
Хм. В Liajit - Точно работает. В чистой 5.1 ща гляну.
Tverd
ну уже увидел,и правда
Tverd
и в 5.1 тоже
Snusmumriken
Пашет.
Tverd
ага, s2 можно почистить... не используется
Tverd
ну а так гуд... классно
Tverd
a = setmetatable({}, {__len = function() return 10 end}) print(#a)
Tverd
не, в 5.1 и луаджите не работает. В 5.2 - да
Snusmumriken
А, всё проще. Версия luajit 2.0.0-beta8 >From Lua 5.2: __len metamethod for tables (disabled by default).
Tverd
ну да, у тебя какая версия?
Tverd
LuaJIT 2.0.4 — Copyright (C) 2005-2015 Mike Pall. http://luajit.org/
Tverd
моя
Snusmumriken
Смотря где. love2d - 2.0.4, которая стабильная. Чистый luajit - 2.1.0-beta2, для всяких читов с микросервисами. И то и то использую x32-битные за ради совместимости.
Tverd
понятно, надо свой значит собирать луаджит мне
Snusmumriken
Зачем? Берёшь luapower и получаешь luajit под венду с большим набором либ, скомпиленных ровно под эту версию.
Tverd
хотя пока не горит, длина особо не нужна, а если и нужна то len могу тупо написать...
Snusmumriken
А, да пофигу, расслабься :3 Luajit по базе имеет неплохое количество расширений, по сравнению с ванильной 5.1
Tverd
))))
Tverd
А в чем пишешь? саблайм?