Welcome to Сообщество игровых серверов NETZONA.ORG

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. Зарегистрировавшись и войдя в систему, вы сможете создавать темы, публиковать ответы в существующих темах, давать репутацию другим участникам, получать собственный личный мессенджер и многое другое. Это также быстро и совершенно бесплатно, так чего же вы ждете?
  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами Публичной оферты Проекта NetZONA.org: https://netzona.org/help/public-offer/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами использования Ваших файлов cookie на Проекте NetZONA.org: https://netzona.org/help/cookies/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с Политикой конфиденциальности Проекта NetZONA.org: https://netzona.org/pages/privacy-policy/

  • Ответы на основные вопросы: https://netzona.org/threads/populjarnye-voprosy-i-otvety-na-nix.6122/

  • Приветствуем на сайте, Гость! Приобрести (купить) Информационную услугу (в том числе группу "Проверенный") на Проекте NetZONA.org: https://netzona.org/account/upgrades

[LUA] Использование table.HasValue

Статус
В этой теме нельзя размещать новые ответы.

MeaDolphi

Пользователь
Регистрация
9 Фев 2017
Сообщения
63
Реакции
1
Баллы
19
Адрес
Russia
Пол
Мужской
Здравствуйте. В одной теме я наткнулся на ответ модератора, который предоставил код используя функцию table.HasValue.

Код для примера.

Lua:
local ply = LocalPlayer()

local tableTeams = {
  TEAM_POLICE,
  TEAM_CHIEF,
  TEAM_THIEF,
}

if table.HasValue(tableTeams, ply:Team()) then
  print("SUCCESSFUL")
end

В чем я вижу здесь проблему эффективности? Данный метод перебирает таблицу следующим образом: сначала он обращается к первому ключу, после чего сравнивает значение со вторым аргументом функции. Так итерации продолжаются, пока не найдут значение равное аргументу, либо пока таблица себя не исчерпает.

Как же нужно подходить к поиску необходимых данных в таблице?

Для начала нужно научиться правильно составлять таблицы. Пример на отрывке кода предоставленном ранее.

Lua:
local tableTeams = {
  [TEAM_POLICE] = true,
  [TEAM_CHIEF] = true,
  [TEAM_THIEF] = true,
}

Теперь нужные нам данные выступают не ключем, а значением. Это позволит нам обращаться по ключу к таблице и получать в возврате значение истина.

Применение на нашем примере указанном ранее:
Lua:
if tableTeams[ply:Team()] then
  print("SUCCESSFUL")
end

Код стал короче и элегантнее, а так же мы не тратим время на процесс перебора таблица, а напрямую проверяем существование данного элемента в таблице.

Используйте данный вид таблиц, когда вам необходимо только проверять, а не перебирать. При переборе таблицы в таком виде придется применять pairs, вместо  ipairs, что так же приведёт к потери эффективности кода.

Спасибо за внимание к данной теме.
 
Последнее редактирование:

Gaurussel

Пользователь
Регистрация
10 Янв 2019
Сообщения
110
Реакции
3
Баллы
35
Пол
Мужской
Есть пару ошибок, а так не к чему придраться (я не придираюсь чтобы тупо до***ться, просто новичкам может быть непонятно):
1) Названия таблиц (в условии) отличаются от созданных.
2) TEAM_CHIEF - в данном случаи ключ, а true - значение.
tableStrings[ply:Team()] - когда мы делаем таким образом, мы находим в таблице элемент по ключу в скобочках, когда находит - возвращает значение.
3) Не pair, а pairs.
Плюсом было бы если ты укажешь различия в pairs и ipairs, ибо ты их выделил, но не объяснил смысл:
ipairs эффективен, если индекс (ключ) является числом и идёт в порядке возрастания, пример ниже.
Lua:
local numericTable = {
    "biba",
    "boba",
    "dva dolboeba"
}

for i, v in ipairs(numericTable) do
  print(i, v)
end

Результат:

1   biba
2   boba
3   dva dolboeba
 
Последнее редактирование:

MeaDolphi

Пользователь
Регистрация
9 Фев 2017
Сообщения
63
Реакции
1
Баллы
19
Адрес
Russia
Пол
Мужской
Есть пару ошибок, а так не к чему придраться (я не придираюсь чтобы тупо до***ться, просто новичкам может быть непонятно):
1) Названия таблиц (в условии) отличаются от созданных.
2) TEAM_CHIEF - в данном случаи ключ, а true - значение.
tableStrings[ply:Team()] - когда мы делаем таким образом, мы находим в таблице элемент по ключу в скобочках, когда находит - возвращает значение.
3) Не pair, а pairs.
Плюсом было бы если ты укажешь различия в pairs и ipairs, ибо ты их выделил, но не объяснил смысл:
ipairs эффективен, если индекс (ключ) является числом и идёт в порядке возрастания, пример ниже.
Lua:
local numericTable = {
    "biba",
    "boba",
    "dva dolboeba"
}

for i, v in ipairs(numericTable) do
  print(i, v)
end

Результат:

1   biba
2   boba
3   dva dolboeba
Это не придирки, все по факту. Исправил, что считал нужным. Просто тема писалась с телефона, в данный момент прохожу срочную службу в армии. Это означает, что могут быть орфографические и логические ошибки, прошу прощения за это.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу