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

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


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

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий

Помнится, когда-то давно была рубка по поводу string.*( s, ... ) vs. s:*( ... ) Сегодня внезапно обнаружил, что for ss in s:*() пытается скорее получить что-то из s, чем из s:*()

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

Ссылка на комментарий

Уточняю ситуацию:

	local s = npc:in_restrictions()
	for ss in string.gmatch( s, "([^%s,]+)" ) do
		log( "info", "motivator_binder(%s):death_callback, single: %s", self.npc_name, ss )
	end
- работает.

for ss in s:gmatch( "([^%s,]+)" ) do - вылет с невнятной руганью.

Ссылка на комментарий

v:normalize() и v:set_length( 1 ) - это таки одно и тоже, или таки нет ?

Что-то про вектора вообще как-то во всех доках стыдливо умалчивают...

 

И еще...

Помнится, обсуждалось, но я так и не понял: 4294967296 - это как ? int64 ?

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Помнится, обсуждалось, но я так и не понял: 4294967296 - это как ? int64 ?

float. Как раз уже пошла ошибка в младших разрядах.
Ссылка на комментарий

 

 

v:normalize() и v:set_length( 1 ) - это таки одно и тоже, или таки нет ?

По смыслу должно быть то же.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Это аналог require(module_name) из академического.. lua.

Идет подгрузка модуля(файла) с именем module_name.

Изменено пользователем Nazgool
Ссылка на комментарий

А ни кто, случайно, не в курсе: нет ли у ЛУА ТЧ (возможно, какой-то одной из версий движка) особенностей в конструкции for k, v in pairs() do ... ?

В частности, эквиалентна ли она вариантам for k, _ in pairs() do ... и for k in pairs() do, если v не нужно совсем ?

 

В смысле, во всех ли версиях поведение одинаково ?

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Доводилось использовать несколько версий lua ТЧ а также стандартные 5.1 - 5.3
Различий не замечал.
А записи абсолютно эквивалентны.
"k" и "v" (да как угодно их называй) - это локальные переменные внутри цикла.
Функция "pairs (t)" в любой версии (по крайней мере использованных мною) возвращает три значения - функцию next, таблицу t и nil.
Т.е.

for k, v in pairs(t) do

можно переписать как:

for k, v in next,t,nil do

И теперь видно, что мы имеем дело с функцией "next"
Т.е. твой вопрос переадресовывается от функции "pairs" к функции "next"
Впрочем и за next-ом различных версий я тоже ничего криминального не замечал, т.е. она как возвращала два значения, так и возвращает.

Те самые "k" и "v" . А как ты их будешь использовать - это сугубо твоё дело. Хоть "k" и "_" , хоть "_" и "v" , хоть только "k".

Ссылка на комментарий

Dennis_Chikin
Я хоть и ответил, но до чертиков в интересно, а что же такое случилось с lua, что в загалi возник такой вопрос?
Это к чему? Ты (Dennis_Chikin) такой человек, что (все уже привыкли, что знаешь много) вроде такие вопросы от тебя слышать как-то... необычно что-ли? Ну как-то так выходит.

Изменено пользователем Nazgool
Ссылка на комментарий

Ну как - нарвался на странное, вот и спрашиваю: мало ли, кто-то где-то такое же видел. Стандарты - стандартами, реализации могут быть разными, и очень даже нестандартными. Причем даже исходники не спасут, поскольку черт его знает, из чего конкретный бинарь собирали.

  • Смешно 1
Ссылка на комментарий

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

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

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

 

Ссылка на комментарий

@dsh а что такое db? У меня есть два предположения. Первое `db == _G` и второе, что у db есть метатаблица с __index, которая возвращает значение из _G.

Ну и есть вариант, что я не угадал (=

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

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

 

this.replace_params

 

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

Ссылка на комментарий
6 часов назад, dsh сказал:

db.actor_test = nil

...

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

Видимо такая особенность луа - неинициализированная глобальная переменная подменяется значением одноименной из _G. Если сделать так:

db.actor_test = "actor_test"
_G.actor_test = "shit"

то у меня выводит "actor_test".

Ссылка на комментарий

Поиск показывает, что проблема эта в 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

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

 

Ссылка на комментарий

dsh

Всё просто кажется сложным. На самом деле обычно не хватает времени разобраться.
А дела обстоят так.

Действительно, у таблицы 'db' существует метаблица, которая посредством метаметода '__index' ссылается на глобальную таблицу '_G'.
Поэтому совершенно естественно, что при запросе несуществующего поля таблицы 'db', поиск поля с таким именем происходит в таблице, на которую указывает '__index'.
Т.е. в таблице '_G'
И это не прихоть игры, таковы законы Lua.
Любой модуль (module) при указании 'package.seeall' будет искать "недостающие" поля в таблице '_G'.
И избавиться от такого поведения (как вы говорите) можно совершенно стандартными способами Lua.

Для это существую стандартные функции Lua - rawget и rawset.
Т.е. давайте перепишем Ваш пример так:

rawset(db, 'actor_test',nil)
_G.actor_test = "shit"

И теперь напечатайте:

log3( "dsh: actor_test = %s", tostring( rawget(db.actor_test))

 

Изменено пользователем Nazgool
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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