Dennis_Chikin 3 658 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка 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 Изменено 2 Марта 2015 пользователем Kirgudu Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
xStream 86 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 Операций goto и continue нет в ЛУА Все, кто стоит на моем пути: идите нахрен и там погибните! © Ссылка на комментарий
Nazgool 250 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 *Shoker* Создай функцию, внутри которой будет твой "кусок кода" и вызывай когда нужно. А вообще ответить сложно. Покажи что у тебя есть (или на примере) и объясни какую часть кода и когда ты хочешь выполнить. И по возможности подробнее. Ссылка на комментарий
*Shoker* 322 Опубликовано 29 Ноября 2011 Поделиться Опубликовано 29 Ноября 2011 Да я вообще узнать хотел. Аналоги goto в паскале и прочее. Ковырялся в коде, и вдруг подумал, что в этом месте хорошо бы было "перескачить" кусок кода, чтобы не заморачиваться с условными операторами. Функции и прочее это да, но всё же не совсем то. Ну раз нет, значит нет - ничего страшного Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Nazgool 250 Опубликовано 1 Декабря 2011 Поделиться Опубликовано 1 Декабря 2011 (изменено) Пробило на писательство, поэтому решил дать немного информации. То ли скучно, то ли альтруизм возыграл... (то ли банально - водка ) Может кому-то нужно будет, может нет, но мне как-то понадобилось отслеживать все события, происходящие с полями таблицы, и производить с ними некие действия (отнюдь не сексуального характера ). Будь то добавление поля, или обращение к таковому. Вот и нашёл (по-украински - досить давно) код. В такой таблице нужно создать единственное поле с уникальным ключём, значением которого, впоследствии, будет ваша таблица. Доступ к этому ключу будет исключён. Ну разве что случайно. Для вашей таблицы создаётся метатаблица с методами обращения (__index) и назначения (__newindex) : local unique_key = 'very_uniquie_key' local mt={ __index=function(t,k) print('GET') return t[unique_key][k] end, __newindex = function (t,k,v) print('NEW') t[unique_key][k] = v end } function proxy(t) local proxy={} proxy[unique_key]=t setmetatable(proxy, mt) return proxy end tab = proxy{} -- Тут создаём таблицу. Только добавляем вызов конструктора 'proxy' -- А тут происходят самые обычные действия tab[4]=7 -- добавляем новое поле --> вызывается метаметод __newindex --> напечатает "NEW" local v = tab[4] -- обращаемся к полю нашей таблицы --> вызывается метаметод __index --> напечатает "GET" Т.е. как и ожидалось. При любом обращении вызывается метаметод. И тут, вместо 'print('GET')' или соответственно 'print('NEW')', можно чего-то там с ним делать. Причём при создании - tab = proxy{} Вы можете передавать уже созданную таблицу.. Например : local t = {[5]='rrr'} tab = proxy(t) Изменено 1 Декабря 2011 пользователем Gun12 Ссылка на комментарий
Nazgool 250 Опубликовано 8 Декабря 2011 Поделиться Опубликовано 8 Декабря 2011 (изменено) Так-ссс. Молчите? Скажу словами Билли (Николай Караченцов, х/ф "Человек с бульвара Капуцинов"), - "Настоящему мужчине всегда есть что сказать" (xStream - я применяю это изречение как метафору ). Ну нет - так нет. Продолжу свой монолог. Только что попался как мальчишка. Спешка, знаете ли, замылила очи. Решал простую задачку, и при сложении (частности опущу, оставлю суть) : local v = 0.1 + 0.1 + 0.1 print(v==0.3) --> false Оказалость что "Y"-то не равен 0,3. Сгоряча меня это привело в ступор. Затем пришёл в себя Это же FLOAT!. Доки (по крайней мере для С/С++) пишут примерно такое : Числа с плавающей точкой хранятся как 53 бита мантиссы, плюс 11 бит экспоненты, плюс знаковый бит. sign | exponent | fraction (часть, доля) 63 | (11 bit) 52 | (52 bit) 0 * | *********** | **************************************************** Для Lua, как надстойку С (and company). думаю это тоже справедливо. Так что стандартную ошибку в написании (мой пример) нужно всегда учитывать. Например для сотых долей - это 17 знаков v = 0.1 + 0.1 + 0.1 if math.abs(v-0.3)<0.0000000000000001 then v=0.3 end print(v==0.3) -- или же более цивилизованно if math.abs(v-0.3)<1e-16 then v=0.3 end print(v==0.3) Для сотых 18 знаков, но для начала наберите такой код : for i=0,1,.05 do print(i) end Единицы в конце Вы не увидете, хотя и должна же быть? Потому что : for i=0,1,.05 do print(i,string.format('%.18f',i)) end Для корректности используйте способ, указанный выше. Дальше... Не помню когда и где, но кто-то просил написать код для окон GUI. В части распределения символов и слов по ширине строки окна. Я, в силу своего увлечения lua, не стал конкретизировать код для сталкера, а расчитал его для максимального количества символов в строке. Ну вдруг кому-то нужно будет? : function expl(s,c) return function () if s == "" then return end local a, b, d = s:sub(1, c), s:sub(c+1), c if not (b:match("^%s") or b:len()==0 or a:match("%s$")) then local v = a while a:match("%S$") do d = d-1 a = a:sub(1,d) if d == 1 then a, d = v, c break end end end s = s:sub(d+1) return a end end for v in expl(s,10) do -- в аргументах указывается строка и число символов, на которые она будет делится (слова не режутся а переносятся целиком) print(v) end Дальше... Ну хватит пока. К столу приглашают. Изменено 8 Декабря 2011 пользователем Gun12 Ссылка на комментарий
_Призрак_ 11 Опубликовано 8 Декабря 2011 Поделиться Опубликовано 8 Декабря 2011 (изменено) Пища для ума А вот такой код: local i= 0.1+0.1+0.2 if (i==0.4) then print("TRY") end Работает как надо Сейчас проверил на С++ #include <iostream> using namespace std; int main () { float i = 0.1+0.1+0.1; if (i==0.3) cout << "i=0.3"<<endl; else cout << "no i=" << i <<endl; float a = 0.1+0.1+0.2; if (a==0.4) cout << "a=0.4"<<endl; else cout << "no a=" << a <<endl; cout << "done"; getchar(); return 1; } Выводит: no i=0.3 no a=0.2 done Никогда не знал об этом Изменено 8 Декабря 2011 пользователем _Призрак_ Freedom Ссылка на комментарий
Nazgool 250 Опубликовано 8 Декабря 2011 Поделиться Опубликовано 8 Декабря 2011 (изменено) Ооо. Люди заитересовались. А если так : local i= 0.1+0.1+0.3 if (i==0.4) then print("TRY") end И объясните - почему? (Не мне а всем) Изменено 8 Декабря 2011 пользователем Gun12 Ссылка на комментарий
_Призрак_ 11 Опубликовано 8 Декабря 2011 Поделиться Опубликовано 8 Декабря 2011 А так у тебя код математически не правилен. Одна десятая + одна десятая + 3 десятых будут равны пяти десятым, но никак не 0.4 Freedom Ссылка на комментарий
Nazgool 250 Опубликовано 8 Декабря 2011 Поделиться Опубликовано 8 Декабря 2011 (изменено) Сорри. Мой адекват уже на уровне обезьяны. local i= 0.03+0.07+0.05 if (i==0.15) then print("TRY") end Ваше слово? Изменено 8 Декабря 2011 пользователем Gun12 Ссылка на комментарий
_Призрак_ 11 Опубликовано 8 Декабря 2011 Поделиться Опубликовано 8 Декабря 2011 Ух ты О_о Написал такой код в С++ #include <iostream> using namespace std; int main () { double i = 0.1+0.1+0.1; if (i==0.3) cout << "i=0.3"<<endl; else cout << "no i=" << i <<endl; double a = 0.1+0.1+0.2; if (a==0.4) cout << "a=0.4"<<endl; else cout << "no a=" << a <<endl; cout << "done"; getchar(); return 1; } Разница с предыдущим кодом только в изменении типа float на double. Результаты удивили: no i=0.3 a=0.2 done Получается что в ЛУА все дробные числа типа double Но почему так происходит - я не понимаю. Знатоки, объясните Добавлено через 6 мин.: Gun12 Тут даже сказать нечего. Хотя есть чего. Буду меньше пользоваться дробными числами от греха подальше Freedom Ссылка на комментарий
Nazgool 250 Опубликовано 8 Декабря 2011 Поделиться Опубликовано 8 Декабря 2011 (изменено) local i= 0.1+0.1+0.5 print(string.format('%.18f',i)) --> 0.699999999999999960 НО НЕ 0.7!!! if (i==0.7) then print("TRY") --> хоть и TRUE end Добавлено через 26 мин.: Да, для корректности кода : for i=0,1,.05 do print(i) end который даст неправильный результат. рекомендую использовать такую конструкцию : for i=0,20,1 do print(i*0.05) end Добавлено через 32 мин.: Да не стесняйтесь задавать вопросы про Lua. И я, и многие другие когда-то тоже начинали. Но в отличии от Вас мы всё это проходили методом проб и ошибок. А теперь уже есть немало доков (инструкций, сайтов), да и я, собственно, буду помогать чем могу. Главное стремление. Как думаете? Добавлено через 48 мин.: Тут высказывалось немало мнений ЗА и ПРОТИВ аддонов к сталкеру, но результат работы, в частности работу RvP, я бы не смог переоценивать. Пускай модули и так создавались при добавлении файла *.script, но теперь я (например) могу создать собственный класс, независимый от прихотей игры. Даже со своим расширением. Мне, к примеру, не нравится работа с файловой системой в сталкере. Теперь я могу воспользоваться своей, для меня более удобной. Я буду парсить *.ltx и *.xml так, как мне это хочется. Я буду даже работать с CMD, реестром (ну если мне это нужно будет). А debug это отдельная тема. Она как (вот уже укранский) суперечлива, так и однозначно (обьективно) полезна во многих ситуациях. Да и время подтвердило, что использование даже стандартных средств Lua избавило от многих проблем. Главное знать когда и где их применить. Добавлено через 26 мин.: На те Вам для напряжения (по Пуаро) серого вещества. Пока без комментариев : -- Перегрузка операции __add для конкатенации строк mt = {} function String(string) return setmetatable({value = string or ''}, mt) end function mt.__add(a, b) return String(a.value..b) end s = String('Hello') print((s + ' There ' + ' World!').value ) Изменено 8 Декабря 2011 пользователем Gun12 Ссылка на комментарий
Malandrinus 615 Опубликовано 9 Декабря 2011 Автор Поделиться Опубликовано 9 Декабря 2011 (изменено) Gun12, if (i==0.4) then print("TRY") end[/code]И объясните - почему? Потому, что за такой код надо обрывать руки. Числа с плавающей запятой на равенство не сравнивают, поскольку вычисления с плавающей запятой приблизительные по определению и выполняются в общем случае с ошибками округления. Вот и всё, что можно здесь сказать. Изменено 9 Декабря 2011 пользователем malandrinus Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Andrey07071977 18 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 (изменено) Некоторое время назад malandrius описал как создать тестовый полигон для скриптов. Если интересно, вот немного модифицированная версия. Добалена возможность исполнять отдельную функцию и передавать в нее аргументы - что очень помогает при тестировании, например callbacks. --[[ Call functions in protected environment (original: http://www.amk-team.ru/forum/index.php?showtopic=6458#entry258260) @param string sType - "file" or "chunk". Required. TODO: "chunk" functionality @param string sName - file path. Optional. Path of the file to load relative to bin, will use default (aa_test.script) if nil. @param boolean bFunc - execute one function with arguments. Optional. By default will execute function test(...) @param table tArgs - arguments for function above. Optional. TODO: find out why ... didn't work. @return object oResult - function execution results (if any) --]] function sandbox(sType, sName, bFunc, tArgs) local sStatus, oResult = pcall(exec, sType, sName, bFunc, tArgs) if sStatus == false then --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Asandbox()~C07 call - ~C0B"..tostring(sResult).."~C07") --// Ouput to screen or log else return oResult end end --[[ Execute file or chunk (original: http://www.amk-team.ru/forum/index.php?showtopic=6458#entry258260) @param string sType - "file" or "chunk". Required. TODO: "chunk" functionality @param string sName - file path. Optional. Path of the file to load relative to bin, will use default (aa_test.script) if nil. @param boolean bFunc - execute one function with arguments. Optional. By default will execute function test(...) @param table tArgs - arguments for function above. Optional. TODO: find out why (...) didn't work. --]] function exec(sType, sName, bFunc, tArgs) local t = tArgs or {} if sType == "file" then if sName then local sReturn = assert(loadfile(sFilePath)) if type(sReturn) == "function" then if bFunc then sReturn() test(t) --// execute specific function with arguments t else sReturn() end else --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec()~C07 call - ~C0B"..tostring(sReturn).."~C07") --// Ouput to screen or log return end else local sFilePath = "..\\gamedata\\scripts\\aa_test.script" local sReturn = assert(loadfile(sFilePath)) if type(sReturn) == "function" then if bFunc then sReturn() test(t) else sReturn() end else --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec()~C07 call - ~C0B"..tostring(sReturn).."~C07") --// Ouput to screen or log return end end elseif sType == "chunk" then --// TODO: chunk functionality return else --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec() ~C07call - invalid sType: ~C0B"..tostring(sType).."~C07") --// Ouput to screen or log end end Примечания - используя Lua перехватчик от alpet, который помимо всего прочего (alpet спасибо!), позволяет выводит строки в одельную консоль и сдвигать ее на второй монитор. Callback: function on_actor_hit(oObj, fAmount, vDirection, oWho, iBoneIndex) aa_util.sandbox("file", "..\\gamedata\\scripts\\aa_test1.script", true, {oObj, fAmount, vDirection, oWho, iBoneIndex}) end aa_test1.script: function test(tbl) oObj, fAmount, vDirection, oWho, iBoneIndex = unpack(tbl) local sWhoName = oWho:character_name() local sWpn = oWho:active_item():section() or oObj:active_item():section() local sBodyPart = aa_util.get_body_part(iBoneIndex) local fActorHealth = oObj.health if fActorHealth <= 0.5 then oObj.health = 1 end -- вевести все на экран или в лог (я использую Lua перехватчик, поэтому вызовы закомментировал - думаю разберетесь) --[[ ODS("~C07[~T] ~C0E[INFO] ~C06Actor hit details: ----------------------------~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Hit by: ~C0B"..sWhoName.."~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Amount: ~C0D"..string.format("%2.1f", fAmount*100).."~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Body P: ~C0B"..sBodyPart.."~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Health: ~C0B"..string.format("%2.1f", fActorHealth*100).."~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Weapon: ~C0B"..sWpn.."~C07") --]] end П.С. Если будут проблемы - пишите, помогу отладить. Прежде всего - спасибо за x-ray extensions и справочник по функциям! Трудно представить сколько времени и усилий было затрачено. Вопросы: 1. При использовании оператора ... у меня выдавалась ошибка по типу no such operator defined. Пришлось использовать table, хотя во многих скриптах этот оператор используется. Чем может быть вызвано? 2. Если будет время, напиши небольшой how-to по xray extensions (r18). Видел люди выкладывали то что извеснто на данный момент, но там далеко не все. Изменено 20 Декабря 2011 пользователем Andrey07071977 Ссылка на комментарий
Artos 99 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 (изменено) Andrey07071977, пара помарок: 1. Функция exec принимает аргументом sName, по наличию которого вызывается функция assert, но в нее передается неопределенный аргумент sFilePath ... 2. В функции sandbox при выводе в лог используется также неопределенная sResult вместо (вероятно) полученной oResult (от pcall). Насчет проблемы с оператором '...' - что-то непонятно ... Укажи места кода в которых у тебя затыкалось. Заменил все твои таблицы на оператор и проверил в игре - никаких заморочек. Использовал так: --[[ Call functions in protected environment (original: http://www.amk-team.ru/forum/index.php?showtopic=6458#entry258260) @param string sType - "file" or "chunk". Required. TODO: "chunk" functionality @param string sName - file path. Optional. Path of the file to load relative to bin, will use default (aa_test.script) if nil. @param boolean bFunc - execute one function with arguments. Optional. By default will execute function test(...) @param table tArgs - arguments for function above. Optional. TODO: find out why ... didn`t work. @return object oResult - function execution results (if any) --]] function sandbox(sType, sName, bFunc, ...) local bStatus, Result = pcall(exec, sType, sName, bFunc, ...) if bStatus ~= false then return Result --/> else --// Ouput to screen or log --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Asandbox()~C07 call - ~C0B"..tostring(Result).."~C07") end end --[[ Execute file or chunk (original: http://www.amk-team.ru/forum/index.php?showtopic=6458#entry258260) @param string sType - "file" or "chunk". Required. TODO: "chunk" functionality @param string sName - file path. Optional. Path of the file to load relative to bin, will use default (aa_test.script) if nil. @param boolean bFunc - execute one function with arguments. Optional. By default will execute function test(...) @param table tArgs - arguments for function above. Optional. TODO: find out why (...) didn`t work. --]] function exec(sType, sName, bFunc, ...) if sType == "file" then if not sName then sName = "..\\gamedata\\scripts\\aa_test1.script" end local Return = assert(loadfile(sName)) --/ sName == sFilePath if type(Return) == "function" then if bFunc then Return() test(...) --// execute specific function with arguments else Return() end else --// Ouput to screen or log --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec()~C07 call - ~C0B"..tostring(Return).."~C07") end elseif sType == "chunk" then --// TODO: chunk functionality else --// Ouput to screen or log --ODS("~C07[~T] ~C0C[ERROR] ~C07in ~C0Aexec() ~C07call - invalid sType: ~C0B"..tostring(sType).."~C07") end end --/ "Пример использования (generic_object_binder:hit_callback):" --/ Callback: function generic_object_binder:hit_callback(oObj, fAmount, vDirection, oWho, iBoneIndex) aa_util.sandbox("file", "..\\gamedata\\scripts\\aa_test1.script", true, oObj, fAmount, vDirection, oWho, iBoneIndex) end --/ aa_test1.script: function test(oObj, fAmount, vDirection, oWho, iBoneIndex) local sWhoName = oWho and oWho:character_name() local sWpn = oWho and oWho.active_item and oWho:active_item() and oWho:active_item():section() --local sBodyPart = aa_util.get_body_part(iBoneIndex) local fActorHealth = oObj and oObj.health if fActorHealth and fActorHealth <= 0.5 then oObj.health = 1 end --/ вевести все на экран или в лог (я использую Lua перехватчик, поэтому вызовы закомментировал - думаю разберетесь) --[[ ODS("~C07[~T] ~C0E[INFO] ~C06Actor hit details: ----------------------------~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Hit by: ~C0B"..sWhoName.."~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Amount: ~C0D"..string.format("%2.1f", fAmount*100).."~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Body P: ~C0B"..iBoneIndex.."~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Health: ~C0B"..string.format("%2.1f", fActorHealth*100).."~C07") ODS("~C07[~T] ~C0E[INFO] ~C07Weapon: ~C0B"..sWpn.."~C07") --]] end Изменено 20 Декабря 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
xStream 86 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 [offtop] Извините, но венгерская нотация - это полная жопа. [/offtop] Что касается песочниц, то... Вот мой вариант: http://dl.dropbox.com/u/46539648/xs_sandbox.rar В архиве - мануал и два примера. Все, кто стоит на моем пути: идите нахрен и там погибните! © Ссылка на комментарий
Artos 99 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 xStream, и не соглашусь с тем что "полная" ;-), т.к. уж лучше такая, чем никакая ... И обычно высказывая мнение приводят хоть какие-то аргументы (кроме "на мой вкус ...") или альтернативы. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
xStream 86 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 Полная, полная. От этих префиксов глаза устают, а мозги кучерявятся. И вообще, было сказано на правах оффтопа, что уже подразумевает ИМХУ. Которое можно оспорить. Если уж нужна аргументация, то лично я считаю, что семантика имен описывает код гораздо лучше, чем использование подобных префиксов. Главное подбирать семантически верные имена. Например - name ну по любому строка по семантике, а bone_index - самодостаточное определение. Спорить не хочу и не буду. Ибо ИМХО, как уже сказала. И вообще, лучше б отписался по сендбоксу. У тебя критика конструктивная получается. :-P Все, кто стоит на моем пути: идите нахрен и там погибните! © Ссылка на комментарий
Artos 99 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 xStream, отвечу с конца (так и оффтопик в тему ляжет). Отпишусь обязательно, но и только что за комп сел и скачал. На вскидку: что-то на половину знакомое, что-то уже заинтересовало, но (вот!) как раз отсутсутвие привычной нотации и достаточно куцая, а порою отсутствующая, семантика - не дает сразу глубоко "въехать в код" ... Согласись, что читая: e, rev, obj, who - не сразу приходит на ум тип данных/объектов, что замедляет 'осмысленное чтение/восприятие'. Поэтому вначале посмотрю, осмыслю и опробую, дабы не отписываться банальностями (хулить иль восторгаться) иль не критиковать понапрасну или обмишурившись ... :-) Соглашусь, что семантика при написании кодов первостепенна для восприятия, но ... наборов то не очень много, а вариаций с типаси данных и прочими нюансами превеликое множество. Не знаю как у других, но читая и обычные текты по диагонали, подобная венгерская симантика позволяет и коды читать аналогично. Т.е. зрительно восприняв начало слова - уже в мозгу откладывается и тип данных и (по семантике) суть переменной переменой, и не обязательно тратить время на полное прочтение и обмозговывание смысла семантики названия и ее связи с типом данных. По своему опыту, именно "мозолящие глаза" префиксы выручают в поисках ошибок при некорректных применениях/использованиях типов данных. Как пример, только сегодня потерял десяток минут в погадалках ошибки, возникшей после оптимизации кода. Было obj:position() для клиентского объекта, а исправил код под серверный, и ... недоглядел. А вот привычное se_obj или soObj - сразу бы резануло глаза и подсказало бы гнилое место ... "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
xStream 86 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 (изменено) Согласись, что читая: e, rev, obj, who Это уже другой разговор. Пример приведен из того кода, где песочница используется. Причем, насколько я понимаю, это сделано как раз потому, что так ПРИВЫЧНЕЕ. Это ты фанат венгерки. Т.е. зрительно восприняв начало слова - уже в мозгу откладывается и тип данных Я единожды уяснив, что это за переменная, не нуждаюсь в том, чтоб мне съедали мозг эти префиксы всюду. Ваши префиксы, может и хороши, но семантикой ваш код тоже не очень то может похвастаться. А вот привычное se_obj или soObj Опять же - кому привычное? У меня есть код, например, где в одной переменной может быть как клиентский объект, так и серверный. При этом логика поведения - не меняется Тут можно долго спорить. Дело предпочтений и привычек. Лично я предпочитаю использовать нечто, очень похожее на Google Code Guideline. Изменено 20 Декабря 2011 пользователем xStream Все, кто стоит на моем пути: идите нахрен и там погибните! © Ссылка на комментарий
kamikazze 266 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 (изменено) Венгерская нотация? Нет уже, спасибо. Артос, тут ты не прав. Это вылазит в ужасный кошмар - код нечитаем, так как постоянная смена регистра вызывает "рваное" восприятие имен, и приходится напрягаться вчитываясь в текст, чтобы осознать название переменной. Соответственно исходник непригоден для скорочтения и на его разбор уходит раз в пять больше времени, это первое. Второе - использовать венгерскую нотацию в Lua - это вообще нонсенс, так как в среде игры нет типов данных, которые бы можно было друг с другом спутать при написании кода. Третье - такие переменные очень тяжело запоминаются что вызывает необходимость часто пролистывать код, что заставляет тратить много времени впустую. Лучше сразу назвать переменную по-человечески и всё, иначе через пару часов работы с таким кодом начинает раскалываться голова просто... А вот привычное se_obj или soObj - сразу бы резануло глаза и подсказало бы гнилое место ... А sobj и gameobj чем неочевидны? Изменено 20 Декабря 2011 пользователем kamikazze Отладчик и скриптер мода OGSE. Автор схемы "Компаньоны", стреляющего БТРа и многих других полезностей Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти