×

Langue

Fermer
Atelier 801
  • Forums
  • Dev Tracker
  • Connexion
    • English Français
      Português do Brasil Español
      Türkçe Polski
      Magyar Română
      العربية Skandinavisk
      Nederlands Deutsch
      Bahasa Indonesia Русский
      中文 Filipino
      Lietuvių kalba 日本語
      Suomi עברית
      Italiano Česky
      Hrvatski Slovensky
      Български Latviešu
      Estonian
  • Langue
  • Tribus
  • /
  • The Great World Alliance
  • /
  • Zigwin's Basement
  • /
  • Lua Tips & Tricks [Черновик]
Lua Tips & Tricks [Черновик]
Zigwin
« Citoyen »
Lua Expert
1563283800000
    • Zigwin#0000
    • Profil
    • Derniers messages
    • Tribu
#1
  1
* Для новичков
** Для тех кому не лень разбираться
*** Для продвинутых новичков

Оптимизация
** Получение цифры из числа
Для получения определенной цифры в числе используйте формулу

Code Lua

1
(n % 10^(l + 1 - i) - i % (l - i)) / 10 ^ (l - i)
где :
  • n - число
  • l - длина числа
  • i - позиция цифры

Если интересно как работает формула

Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
--[[
% Дает остаток от деления, то есть
--]]
print(3 % 2) -- 0
print(4 % 2) -- 1

print(9 % 3) -- 0
print(8 % 3) -- 2

print(123 % 10) -- 3
print(123 % 100) -- 23
print(123 % 1000) -- 123

-- Таким образом можно с легкостью получить последнюю цифру любого числа
print(25 % 10) -- 5
print(781231232 % 10) -- 2

-- Но как получить, например, только 2 из числа 123
-- Вот так
--[[
123 % 100 = 23
123 % 10 = 3
23 - 3 = 20
20 / 10 = -- 2
--]]
-- Объединяем все в одну строку...
print((123 % 100) - (123 % 10)/10)
-- Вот и все.

Использование преобразования в строку в 8 раз медленнее :
Code Lua

1
tostring(n):sub(i,i)

* Отпимизация pairs()

Вместо ипсользования
Code Lua

1
2
3
for i, v in pairs(table) do
...
end

Лучше писать
Code Lua

1
2
3
for i, v in next, table do
...
end

Результат тот же, но работает немного быстрее
Обьяснение в теме от Bolodefchoco :
[url=ССЫЛКА]ССЫЛКА[/url]

*** Локальные переменные

Локальные переменные существуют в пределах одного блока, вне его пределах они удалаются
Code Lua

1
2
3
4
5
do -- Какой-то блок, например for ... do ... end или if ... then ... end и т.д
local a = 10
print(a) -- 10
end
print(a) -- nil
Локальная переменная существует только в том блоке, в котором вы её объявили, даже если была переменная с таким же именем, она временно заменит её
Code Lua

1
2
3
4
5
6
local a = 20
do
local a = 10
print(a) -- 10
end
print(a) -- 20
Каждый раз когда добавляете новую переменную, делайте её локальной, но возникает вопрос, что если я не хочу чтобы переменная удалялась в данном блоке а на блок выше
Code Lua

1
2
3
4
5
do
local a = 20
print(a) -- 20
end
print(a) -- nil
Решение
Code Lua

1
2
3
4
5
6
local a
do
a = 20
print(a) -- 20
end
print(a) -- 20

** Ссылки на таблицы

Тут проще показать
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- Код для определения игрока с большис кол-вом очков
local score, name = 0, name
for playerName, playerData in next, tfm.get.room.playerList do

if playerData.score > score then

score = playerData.score
name = playerName

end

end
print(score)
print(playerName)
Можно оптимизировать, если написать так
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- Код для определения игрока с большис кол-вом очков
local score, name = 0, name
for playerName, playerData in next, tfm.get.room.playerList do

local _score = playerData.score -- *

if _score > score then -- *

score = _score -- *
name = playerName

end
end
print(score)
print(playerName)

Не самый лучший пример, но я думаю, вы поняли

** table.insert

table.insert делает кучу не нужных действий, просто чтобы добавить значение в таблицу
Его стоит использовать, только, если вам необходимо вставить значение в середину или в начало таблицы, со сдвигом остальных значений, но все же мне еще ни разу это не пригодилось, так что используйте лучше
Code Lua

1
table[#table + 1] = ...
А еще лучше
Code Lua

1
2
3
4
5
local table, counter = {}, 1
for i, v in next, anothertable do
table[counter] = v -- Добавляем значение
counter = counter + 1 -- Прибавляем 1 к счетчику
end
И по возможности не забывать использовать переменные которые уже есть
Code Lua

1
2
3
4
local table, counter = {}, 1
for i = 1, 10 do
table[i] = i -- Счетчиком является i из цикла for
end

** Конкатенция строк

Если говорить кратко, то там где возможно, лучше использовать table.concat, вместо ..
И легче, и быстрее
Так не надо
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
local t = {
{1, 2}
{3, 4}
{5, 6}
}

local a = ""
for _, value in next, t do
for _, value2 in next, value do
a = a..value2.." "
end
end
print(a)
А так надо
Code Lua

1
2
3
4
5
6
7
8
9
local t = {
{1, 2}
{3, 4}
{5, 6}
}

for _, value in next, t do
print(table.concat(value, " "))
end
Или
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
local t = {
{1, 2}
{3, 4}
{5, 6}
}
local toprint, c = {}, 1
for _, value in next, t do
for _, value2 in next, value do
toprint[c] = value
c = c + 1
end
end
print(table.concat(toprint, " "))

Остальное

* table.foreach

В последних версиях луа table.foreach удален, но не в тфм, обычно его используют один раз и следующим образом
Code Lua

1
2
3
4
5
function eventNewPlayer(playerName)
...
end

table.foreach(tfm.get.room.playerList, eventNewPlayer)
Таким образом все что в eventNewPlayer будет срабатывать на всех новых игроках и активируется для всех игроков в комнате



Если не лень напишу
  • Список популярных ошибок и как их исправить
  • Небольшой гайд по форматированию текста (HTML теги и т.д.)
  • Как использовать eventTexareaCallback и <a href='event:'>
  • Можете предложить что-то свое, написав сообщение
Zigwin
« Citoyen »
Lua Expert
1565096760000
    • Zigwin#0000
    • Profil
    • Derniers messages
    • Tribu
#2
  0
ok fk this thread ill translate one from lua wiki instead so this will lean there for until this forum dies
Dejdara
« Citoyen »
Scientist
1577702280000
    • Dejdara#0000
    • Profil
    • Derniers messages
    • Tribu
#3
  0
Гайд по форматированию текста был бы интересен
  • Tribus
  • /
  • The Great World Alliance
  • /
  • Zigwin's Basement
  • /
  • Lua Tips & Tricks [Черновик]
© Atelier801 2018

Equipe Conditions Générales d'Utilisation Politique de Confidentialité Contact

Version 1.27