Jump to content
Malandrinus

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

Recommended Posts

Dennis_Chikin    3,611

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

 

Установка 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

Edited by Kirgudu

Share this post


Link to post
Share on other sites
Карлан    1,032

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

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

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,611

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

	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 - вылет с невнятной руганью.

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,611

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

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

 

И еще...

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

Edited by Dennis_Chikin

Share this post


Link to post
Share on other sites
abramcumner    925

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

float. Как раз уже пошла ошибка в младших разрядах.

Share this post


Link to post
Share on other sites
Zander_driver    5,248

 

 

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

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


~~~ ~~~ ~~~

 

Share this post


Link to post
Share on other sites
Kober(BRUC)    97

Добрый день!

Можно ли силами Lua подключиться к процессу и в определённый адрес записать значение?

Share this post


Link to post
Share on other sites
Graff46    477

Подскажите что это делает?

prefetch("_G")

Share this post


Link to post
Share on other sites
Nazgool    246

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

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

Edited by Nazgool

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,611

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

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

 

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

Edited by Dennis_Chikin

Share this post


Link to post
Share on other sites
Nazgool    246

Доводилось использовать несколько версий 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".

Share this post


Link to post
Share on other sites
Nazgool    246

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

Edited by Nazgool

Share this post


Link to post
Share on other sites
Dennis_Chikin    3,611

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

  • Haha 1

Share this post


Link to post
Share on other sites
Graff46    477

Вопрос по luabind:

class (my_new_class)  (parent_class)
function my_new_class:_init ()
	...
end

Можно ли обращаясь к my_new_class получить его предка, т. е. parent_class ?

Share this post


Link to post
Share on other sites
dsh    2,978

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

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

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

 

Share this post


Link to post
Share on other sites
Desertir    202

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

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


ТЧ 1.0004. SAP и Trans mod

github

Share this post


Link to post
Share on other sites
dsh    2,978

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

 

this.replace_params

 

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

Share this post


Link to post
Share on other sites
AndreySol    129
6 часов назад, dsh сказал:

db.actor_test = nil

...

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

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

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

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

Share this post


Link to post
Share on other sites
dsh    2,978

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

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

 

Share this post


Link to post
Share on other sites
Nazgool    246

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))

 

Edited by Nazgool

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

AMK-Team.ru

×
×
  • Create New...