Перейти к контенту

Язык Lua. Общие вопросы программирования


Malandrinus

Рекомендуемые сообщения

@RayTwitty, общее правило, во всех языках, которые я знаю, от хэша, т.е. от структуры, к элементам которой мы обращаемся по произвольному ключу, опрометчиво ожидать порядка в возвращаемых ключах. Как решать этот вопрос, зависит от тоей задачи, которую никто не знает, кроме тебя. Может тебя надо получить список ключей и отсортировать их предварительно. А может тебе какая-то другая структура данных нужна. Я в своей практике не встречал ситуаций, вот что бы прямо кровь из носу, но хэш мне должен возвращать ключи в порядке их записи. Всегда есть варианты.
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
вторая строка проверяет ГГ - это актор или нет?

 

Она проверяет, есть-ли у нас в этот момент актор или нет. Проверяет немного по дурацки, на мой взгляд. Потому, что

 

2) Зачем нужна эта проверка на nil?

 

проверка на nil в данном случае не нужна. Нужна просто проверка на истинность. Т.е.

if db.actor then
end

Изменено пользователем dsh

Поделиться этим сообщением


Ссылка на сообщение

Вот вот, именно это я и имел ввиду, только не умею так развернуто излагать свои мысли.


 

 

в каких случаях нужна проверка на nil

 

Ну, тебе уже показали пример. Я добавлю. Часто я проверку на nil, или подобное значение в других языках, использую, как третье логическое значение. Т.е. я использую ДА, НЕТ и НЕ ЗНАЮ. Вот nil - это и есть это самое НЕ ЗНАЮ.

 

Ну например. Есть у меня функция, которая возвращает, является-ли данный непись врагом. К примеру. Она возвращает true, что означает безусловно враг; false, что означает безусловно не враг; и nil, что означает не знаю, проверяй другими методами.

Поделиться этим сообщением


Ссылка на сообщение
@naxac, подозреваю, в глобальном пространстве имен оно будет, т.е. в G. Хорошая, кстати, грабля. Ошибиться достаточно легко, а причину глюков потом искать у-у-у...
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

Даже не знаю, в какую тему правильнее. Наверное сюда, т.к. это наверное к lua больше относиться. Как объяснить вот такое поведение?

db.actor_test = nil
_G.actor_test = "shit"
log3( "dsh: actor_test = %s", tostring( db.actor_test ) )

В лог выводит "shit".

 

Поделиться этим сообщением


Ссылка на сообщение

@Desertir db - это db.script. Насчёт метатаблицы, я никакой метатаблицы не назначал. Да и это поведение не только с db.script, а с любым скриптом. Например, вот такой вариант

 

this.replace_params

 

тоже пойдёт в _G, если replace_params не будет определен. И вот я думаю, как бы мне от такого поведения избавиться, и при этом не поломать глобальные переменные.

Поделиться этим сообщением


Ссылка на сообщение

Поиск показывает, что проблема эта в lua давно известна. @Desertir угадал верно, это из-за неявной метатаблицы, которую в моем случае делает module() с package.seeall. Вот что пишут вот тут, к примеру:

Quote

 package.seeall gives the module a metatable with an __index that points to the global table, so the module can now use global variables. The problem with this is that the user of the module can now see global variables through the module

И похоже, простых вариантов этого избежать - нет.

 

Поделиться этим сообщением


Ссылка на сообщение

@Nazgool а это уже не простой способ. О чем я и написал. Это уже изменение всех скриптов, которые используют db.actor. Изменение большого кол-ва скриптов = новые ошибки. Так-то варианты и другие есть, разной степени сложности. Я же под простым способом подразумевал такой, который полностью совместим с существующими скриптами. А вообще, это проблема не стоит усилий, затраченных на ее решение.

Поделиться этим сообщением


Ссылка на сообщение

@Nazgool это как раз нормальный вариант. Вот только сходу не нашел, на что заменить. Да брось, не стоит оно затраченных усилий. Я прекратил эксперименты на эту тему, т.к. есть более приоритетные задачи. Просто отписался для тех, кто будет искать информацию на эту тему.

 

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin овнокод, очевидно, нужно переписывать. У меня, кстати

local s  = "1"
local v  = s + 0
local v2 = v + 2
log3( "dsh: v = %d, v2 = %d", v, v2 )

выводит

dsh: v = 1, v2 = 3

Т.ч. не могу сказать, что я понял проблему. Впрочем, у меня и 

--LUA version: [LuaJIT 2.0.5]

 

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin это вроде обыкновенный 1.0006 с мелкими двоичными врезками в рендер. Сомневаюсь, что там какие-то изменения в lua. Максимум, может быть RVP подключен или как оно там называется.

 

Поделиться этим сообщением


Ссылка на сообщение

Если ты спрашиваешь, то тебе это сейчас точно не нужно. Когда и если понадобится, ты сразу поймёшь. Мне пару раз нужно было. Если я правильно помню, у меня в скрипте была функция с таким же именем, как и в _g.script, но с другим содержимым конечно. Вот для её вызоваа я и использовал вариант через this. Это если я ничего не перепутал за давностью. Кажется ещё какие-то заморочки были, но я уже не помню. 

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...