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

Язык 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
Ссылка на комментарий

Улыбает напор некоторых писателей, которые игнорируя сам вопрос, яростно набрасываются на ответ, в котором достаточно кратко и ясно дан ответ и кратко упомянуто про нюансы - "при неудачном написании может получаться ..."

Авторы этих постов ставят под сомнение существование различных нюансов при использовании различного синтаксиса написания? Отрицают, что при неудачном написании кода могут быть нюансы-ошибки?

Мною дан ответ именно на вопрос и в частности на "или ещё какие-нибудь нюансы? ", и приведен один из них.

sapsan, Desertir вами отрицается само существование упомянутого нюанса? Нет, так на кой тратите время на нетребуемое авторами вопроса и ответа способы исправления этого частного нюанса (тем более один из ваниантов с пробелом уже дан)? :dash2: Успокойтесь, когда спросят об этом тогда и пишите трактаты, а еще лучше - отвечали бы на сами вопросы, но по сути, а не ... потугами трактовать частности.

 

Desertir, (по сути) ты хоть понимаешь о чем речь?

Автор вопроса дал две формы записи, о второй (tbl.index) ты в ответе сказал НЕВЕРНО(!) - "во втором это ключ-строка, т.е. константа". Это такая же переменная как и в первой форме записи, или до тебя до сих пор это не дошло и требует разъяснения?

И для чего расписывать частность (да еще второй раз). Никто не ставит под сомнение неидентичность двух записей при строковом значении index, или ты себя убеждаешь в очевидном?

Речь о том, что автор вопроса не случайно спрашивает именно про tbl[index] где index может быть любым типом данных, которыми оперирует Lua, что в твоем ответе ставится под сомнение.

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

 

sapsan, большое спасибо про упоминание названия "длинные скобки", а то и подзабыл и как-то не находил время освежить в памяти этот момент. :) Да и для других подобное напоминание не лишним будет.

Баг не работает. Или его доработать, или удалить и не пугать людей.

Прочти исходный вопрос и о том, что спрашивает автор... Если баг ворзможен - то об этом и говорит данный пример.

Изменено пользователем Artos
  • Не нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos,

Твоя рекомендация расставлять пробелы между парными скобками - бред. Нет "неудачных" написаний. Есть синтаксические ошибки. И написание a[b[c]] -- корректно.

А личные "фэ" - в личку.

P.S. Поздравляю с праздником профессиональным :)

 

Изменено пользователем sapsan
  • Нравится 1
Ссылка на комментарий

sapsan, где ты увидел рекомендации? Мною указан вариант, который позволил мне устранить ошибку при парсеринге написанного кода.

В чем по твоему бред при использовании вместо tbl[tbl2] => tbl[ tbl2 ], что позволяет не задумываться о способах комментирования данной записи?

По-мимо явных синтаксических ошибок существуют двузначности при написании кода, которые при парсинге строк могут вызывать ошибки/баги и мною называются - "неудачное" написание. Не нравится название (определение) - не используй.

  • Не нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

 
new_table[key1_name].param1 = {}

что означает такая запись ? В таблице new_table ключ key1_name имеет значение "пустая таблица param1" ?

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

AndreySol, это значит, что таблица new_table будет иметь следующий вид:

new_table = {
   [key1_name] = {
       ["param1"] = {}
   }
}

Изменено пользователем ColR_iT
  • Нравится 1
Ссылка на комментарий

Понял Вас, спасибо. А что эа обращение к полям таблицы через '.', ранее не втречал такого. Поясните, если есть желание.

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

AndreySol, скажем так - это некоторая особенность языка. Если совсем поверхностно и ты знаком хотя бы с основами ООП, то обращение к элементам таблицы через квадратные скобки - это обращение как к элементам таблицы, а через точку - как к структуре.

Если глубже - тогда тебе читать документацию по Lua.

P.S. Вот такие две записи эквивалентны:

tbl = {}
tbl["index1"] = 1
tbl.index1 = 1

Обе эти записи обозначают, что в таблицу tbl записан новый элемент равный числу 1, под индексом "index1".

Есть и другие особенности применения точки для таблиц. Например в игре, все функции что ты используешь - это по сути одна большая таблица, если быть точным, то это таблица _G. И когда ты в какой-нибудь функции пишешь что-то вроде такого:

file_name.function_name()

Это означает, что нужно из таблицы file_name найти элемент function_name, а поскольку это функция, то ты вызываешь функцию.

 

P.P.S. Буду рад любой критике.

Изменено пользователем ColR_iT
  • Нравится 2
Ссылка на комментарий

Критики не будет, от меня по крайней мере.

А обращение через точку к элементам таблицы похоже на тоже самое для массивов в C++ и WinAPI ...?

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

Ребят вопрос, возможно ли в LUA такое:

...

for i=1,3 do

local vName_..i = "vName_"..i

end

...

Изменено пользователем Viнt@rь
Ссылка на комментарий

Viнt@rь , невозможно. Об'являя локальную переменную: local vName... - ее имя должно быть определено сразу и оно (имя) не имеет типа данных (даже не 'nil'). - т.о. уже при объявлении самой переменной ты получишь фатальную ошибку оператора конкатенации (сцепления строк).

С глобальными переменными нечто подобное можно выполнять, используя представление их имен как this[ "vName"..i ], но ...какова цель в таких извратах? ;-)

Изменено пользователем Artos
  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos, есть одна идейка, сделать свой дебаггер/отладчик так сказать, точнее, усовершенствовать его, и выложить в люди, облегчить конечному пользователю использование данной вещички, вот с помощью таких "извратов" не надо будет создавать там к примеру 300 строк(каких то) за ранее и заставлять пользователя вписывать все под себя(к примеру в окне опций вкл выдачу/запись логовых функций из данного скрипта или нет(я имею ввиду инициализацию кнопок и тп)), сделать, так сказать, автономность, от пользователя останиться лишь закинуть скрипт куда надо и добавить в табличку, или в список в *.ltx(пока не определился), да и для себя тоже интересно, получиться ли такое или нет))

Изменено пользователем Viнt@rь
Ссылка на комментарий

Viнt@rь, возможно я не до конца понял твою мысль, но точно можно сделать так:

tbl = {}
for i=1, 3 do
   tbl["vName_"..i] = "vName_"..i
end

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

Ну так и формулировал бы не кастрированный вопросик, а в контексте задачи ...

Взгляни например на это (из скрипта спальника Симбиона):

function CUI_DreamManager:InitCallBacks()
 self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.OnBtnQuit, self)
 for i=1,5 do
   self["OnBtnAct_"..i] = function() self:OnBtnAct(i) end
   self:AddCallback("btn_"..i, ui_events.BUTTON_CLICKED, self["OnBtnAct_"..i], self)
 end
end

function CUI_DreamManager:OnBtnAct(iNum)
 --/ обработка iNum-кнопки
end

- и подобным образом вполне можно избегать десятков строк и отдельных функций по каждой кнопке... ;-)

(но это уже скорее тема для "Скриптования" а не по чистому Lua)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Раз уж мы в такой теме, то теоретически правильнее будет сказать не "С глобальными переменными нечто подобное можно выполнять", а "нечто подобное можно выполнять с полями таблиц".

Т.к. в lua различают три вида переменных - глобальные, локальные и поля таблиц.

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

Gun12? я все же не стал бы жестко формулировать, т.к. вполне можно и к классам (а это 'userdata', см. пример выше) пристроиться... ;-)

Да и как то ... объявляя в своем скрипте/модуле глобальную переменную: My_Variable = nil , довольно странно обзывать ее полем таблицы, хотя конечно в конечном счете это и так. :-)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Artos

Говоря о переменных, мы говорим о их именах, а в случае таблиц - ключах, которые, как известно, могут быть любого типа (кроме nil конечно).

Поэтому 'userdata' ничем не отличается от других.

 

Я подозревал что может возникнуть вопрос, - "А чем отличается глобальная переменная от поля таблицы", но никак не наоборот.

Впрочем ты сам и ответил, что в конечном счёте глобальная переменная является полем таблицы.

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

ColR_iT, Artos, спс :) В принципе, я догадывался, что с полями таблиц можно такое творить, мне интересно было узнать, можно ли такое делать именно с такой формой обьявления переменной(local vName="vName"; vName="vName").

 

ЗЫ Artos, да, чет не подумал заглянуть в твои скрипты)) обычно оттуда и тяну все интересное/полезное/нужное, а тут совсем вылетело из головы)

Изменено пользователем Viнt@rь
Ссылка на комментарий

А в Lua случаем нету возможности неявно передать в функцию название скрипта, откуда она была вызвана?

У меня например в сталкере есть функция, которая всегда принимает первым аргументом имя скрипта, из которого она была вызвана.

Есть желание сделать этот процесс неявным, может есть какие то глобальные флажки или спец-функции для этого?

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Viнt@rь, для SIMBION'a существует технологический аддон SMB-SHOC_Dbg_Tools (~20.2 кБ , запакован в xdb) где возможно аналог того, что затеял или то, что может быть полезным для твоей затеи ;-)

 

*Shoker*, этот вопрос уже обсуждался. Хочешь подобное в игре (в чистом Lua это есть) - расширяй движек до активизации name_space 'debug' и почитай про его возможности и использование. В ЧН и ЗП в _G.printf(fmt,...) остались остатки примера использования от разрабов.

 

Gun12,

поэтому если суть/смысл не меняется - вполне допускаю удобное наименование, тем более более привычное для большинства на этом форуме, (порою даже жаргонарии). :-)

 

Изменено пользователем Artos
  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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