Serge! 127 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 Почему тебе следующий вариант не нравится? function isBool(value) type(value) == 'boolean' end да хотя-бы потому, что это не рабочий вариант. Вы сами то попробовали её запустить? Я попробовал, у меня не получилось ее даже в SciTE запихнуть. Ругается. А так все нормально, все буковки правильные. Вам не кажется, что это уже в простой трёп переходит? Я же Вам ничего не советовал. Вы правильно дианостировали ошибку в том фрагменте кода (там еще был метод find применённый к таблице, хотя обычно применяется для строк, но я не претендую на эксперта Lua и его расширений для Сталкера - возможно такое применение и корректно. Но у меня в _G такого метода для таблиц нет). И так можно перебрасываться очень долго, пока меня окончательно не забанят. По сему на этом всё. Ссылка на комментарий
Desertir 202 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 (изменено) Расшифруй.Я о том, что type возвращает одну из строк nil, boolean, number, string, userdata, function, thread, tableОни все известны, их конечное число и они описаны в доках, и мне непонятна фраза про непредсказуемые моменты. Всё вполне предсказуемо. Ну типы то надо знать... Изменено 15 Октября 2015 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Serge! 127 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 Ну типы то надо знать... Типы то я знаю, а вот Вы так и не поняли, что функуция проверяет не типы, а объекты. Ведь это две большие разницы, не правда ли? Или Вы и с этим не согласны? Ссылка на комментарий
Карлан 1 049 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 (изменено) @Desertir, там все ясно, он мне в личку отписал, он путает перевод в булево с проверкой существования переменной, причем с относительно НЕпустым значением.Приведу цитату (просьба не притягивать за уши и опять меня в чем-то обвинять): Неверно. Если такой объект существует (буть то функция, нить, userdata и т.д) она вернёт true, а если не существует (нет его в _G), то вернёт false. Все корректно. Это никак не проверка типа на булево. Если попробовать поискать что-то подобное у себя, то только такое могу предложить: function is_correct(x) return not (is_false(x) or is_nil(x)) end Для toboolean у меня используется двойное отрицание, в таком виде lua безопасно переводит любой тип в булево значение, следует только учитывать при работе с нулем и единицей, их не переводит, они оба true, потому при работе с нулем как false следует это учитывать. Изменено 15 Октября 2015 пользователем Карлан Ссылка на комментарий
Serge! 127 Опубликовано 15 Октября 2015 Поделиться Опубликовано 15 Октября 2015 он путает перевод в булево с проверкой существования переменной я не собираюсь ни в чем, никого обвинять, просто прошу напомнить где я говорил о "переводе в булево"? Может я что-то забыл, тогда я не прав. Я всё время твержу о проверке зачения объекта, а не его типа. Переименуйте функцию в thisObjIs(var) и забудьте про тип возвращаемого ею значения. Тогда может вопросы отпадут? Ссылка на комментарий
Desertir 202 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 да хотя-бы потому, что это не рабочий вариантОчевидно надо дописать return, про который я забыл, ошибка очень легко диагностируемая, появляется частенько если писать код быстро. У меня такое бывает, ошибаюсь. Вопрос только в том, почему для тебя это не очевидно? Вам не кажется, что это уже в простой трёп переходит? Я же Вам ничего не советовал.Нет, не кажется, я хочу помочь, однако советов я не давал, я только задавал вопросы. Несколько наводящие, но вопросы, чтобы ты сам постарался понять свою проблему. что функуция проверяет не типы, а объектыКонечно объекты, в Луа нет работы напрямую с типами, отчасти мета-таблицы, которые хоть немного привносят рефлексию. Это же скриптовый язык, он должен быть простым. он путает перевод в булево с проверкой существования переменнойНу ок. В JavaScript вообще все просто, написал два раза восклицательный знак вот и перевел в булево используется двойное отрицаниеВот и я об этом. 1 ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Serge! 127 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 ты сам постарался понять свою проблему. У меня конкретно в этом случае нет проблемы, это раз.Два, в последний раз повторяю, я не проверяю типы, не пытаюсь перевести их в булево, а проверяю значение объекта на факт его существования и на то, что он не пустой (number не 0, string не "" и т.п.). И только результат такой проверки получаю в виде булевского значения. Других слов снять вашу зашторенность у меня просто нет, извините. Разве что переименуйте мысленно эту функцию из isBool(var) в thisIsObj(var) и тогда возможно станет понятнее моя цель.А за вопросы, особенно наводящие, большое человеческое спасибо. в Луа нет работы напрямую с типами добавлю. И здесь Вы не правы. В Lua допускается и имеется возможность изменения типа значения, ограниченная правда, но имеется.Примеры: 1. указанное Карлан двойное отрицание. 2. tonumber(var) - перевод в тип number. 3. tostring(var) - перевод в тип string.Продолжить? или этого достаточно? Ссылка на комментарий
FonSwong 33 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 Нужна помощь со строками Нужно получить из строки(s) текст от 1 пробела до второго. индекс 1 пробела нахожу, а вот со 2 пробелом проблема. Подскажите пожалуйста. local s = "! Волк где ты?"--ввод с пда log1(get_substr_since_first_to_two_space(s))--запуск функции которая должна вернуть слово Волк function get_substr_since_first_to_two_space(line) if not contains(line," ") then return "" end local space1 = index_of(line," ")+1--узнаём индекс 1 пробела + 1 local space2 = -1--узнаём индекс 2 пробела - 1 return substring(line,space1,space2) end ------------------------------------------------------ -- Автор DukeKan -- 25.04.2013 ------------------------------------------------------ ------------------------------------------------------ -- Служебные функции для удобной работы со строками ------------------------------------------------------ -- Функция возвращает подстроку с 1 символа и до ближайшего пробела, не включая его function get_substr_until_first_space(line) if not contains(line," ") then return "" end return substring(line,1,index_of(line," ") - 1) end --[[ function get_substr_since_first_to_two_space(line) if not contains(line," ") then return "" end local sbst = index_of(line," ") local sbst2 = substring(line,sbst + 1,sbst - 1) return substring(line,sbst + 1,sbst2) return substring(line,index_of(line," ") + 1,substring(line,index_of(line," ") + 1,index_of(line," ") - 1)) end ]] -- Функция возвращает подстроку с пробела (первого) и до конца function get_substr_since_space_to_end(line) if not contains(line," ") then return "" end return substring(line, index_of(line," ") + 1) end -- Вычисление длины строки function length(line) if line == nil then return nil end return string.len(line) end -- Выделение подстроки по индексам function substring(line,begin,ends) if ends == nil then ends = length(line) end return string.sub(line, begin, ends) end -- Находит первое вхождение в строку второго аргумента, -- возвращается не только первое вхождение, но и индекс, на котором вхождение заканчивается function index_of(line,substring) return string.find(line, substring) end -- Содержит ли строка данную подстроку function contains(line,substr, first, simple) if (length(line) < length(substr)) then return false end if string.find(line,substr,firts, simple) == nil then return false else return true end end -- Заменяет первое вхождение old в строке line на new function replace_first(line,old, new) if contains(line,old) then line = substring(line,1,index_of(line,old) - 1)..new..substring(line,index_of(line,old) + 1) end return line end -- Заменяет все вхождения old в строке line на new function replace_all(line,old,new) return string.gsub(line, old, new) end -- Проверяет, начинается ли строка с данной подстроки function starts_with(line,substring) local b,e = index_of(line,substring) return (b == 1 and e == length(substring) ) end -- Проверяет, заканчивается ли срока line последовательностью substring function ends_width(line,substring) if (length(substring) > length(line)) then return false end local begin,ends = index_of(line,substring) if (begin == nil) then return false end return (ends == length(line) and begin == length(line) - length(substring) + 1) end -- Проверяет, является ли строка пустой. true, если пустая, false иначе function is_empty(line) return length(line) == 0 end -- Переводит все буквы в нижний регистр function to_lower_case(line) return string.lower(line) end -- Переводит все буквы в верхний регистр function to_upper_case(line) return string.upper(line) end ------------------------------------------------------ -- Тесты ------------------------------------------------------ function accert_true(boolean, message) if not boolean then err_log("Error at "..message) end end function accert_false(boolean, message) if boolean then err_log("Error at "..message) end end function accert_equals(arg1, arg2, message) if arg1 ~= arg2 then err_log("Error at " .. message) end end function accert_not_equals(arg1, arg2, message) if arg1 == arg2 then err_log("Error at " .. message) end end function test_script() local a = "abcdefghijk" local b = "aaabbbcccddd" local c = "somestring" local d = "aabbccaabbcc" local e = "vvv ccc" local g = " vvv ccc " local j = "" local f = nil local h = "AaBb" accert_equals(get_substr_until_first_space(e),"vvv","get_substr_until_first_space") accert_equals(get_substr_until_first_space(g),"","get_substr_until_first_space") accert_equals(get_substr_since_space_to_end(e),"ccc","get_substr_since_space_to_end") accert_equals(get_substr_since_space_to_end(g),"vvv ccc ","get_substr_since_space_to_end") accert_true(length(a) == 11, "length") accert_true(length(j) == 0, "length") accert_true(length(f) == nil, "length") accert_equals(substring(b,4,6),"bbb","substring") local x,z = index_of(d,"cc") accert_true(x == 5 and z == 6, "index_of") accert_true(contains(e,"cc"),"contains") accert_false(contains(e,"dd"),"contains") accert_equals(replace_first(d,"b", ""),"aabccaabbcc","replace_first") accert_equals(replace_first(d,"a", ""),"abbccaabbcc","replace_first") accert_equals(replace_all(d,"b", ""),"aaccaacc","replace_all") accert_true(starts_with(c,"some"),"starts_with") accert_true(ends_width(c,"string"),"ends_width") accert_true(is_empty(j),"is_empty") accert_false(is_empty(h),"is_empty") accert_equals(to_lower_case(h),"aabb","to_lower_case") accert_equals(to_upper_case(h),"AABB","to_upper_case") end Ссылка на комментарий
Charsi 440 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 (изменено) @FonSwong, захватываем всё, что после первого пробела и не относится к пунктуации. local s = "! Волк, где ты?" print(s:match("%s(%P*)")) --> печатает 'Волк' @Serge!, продолжай. Изменено 16 Октября 2015 пользователем Charsi Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
FonSwong 33 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 , где можно почитать по работе со строками? или готовые примеры понятные (ссылку можете дать?) Ссылка на комментарий
Карлан 1 049 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 @FonSwong, документация по луа от Иерусалимского (не хочу ударятся в брюзжание, но надо читать шапку темы), там и про строки и про паттерны, а твой спойлер это жуть . Ссылка на комментарий
FonSwong 33 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 Карлан, чего жуть то Ссылка на комментарий
Карлан 1 049 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 @FonSwong, абсолютно бессмысленные оболочки непонятно зачем (сделанные) и для чего, это просто нагромождение, хлам если хочешь. Ссылка на комментарий
Desertir 202 Опубликовано 16 Октября 2015 Поделиться Опубликовано 16 Октября 2015 (изменено) Разве что переименуйте мысленно эту функцию из isBool(var) в thisIsObj(var) и тогда возможно станет понятнее моя цель.Я даже не знаю что на это сказать. Я понимаю, что тема была про проверку на существование и пустоту, но почему isBool? Это не просто неверное именование функции, это наименование для заблуждения читающего, случайное или намеренное - не важно. Важно то, что ты предоставил свой вариант общественности, и он весьма странный. И здесь Вы не правыЯ про Фому, а ты мне про Ерёму. Я говорю о типах как о значениях. В Lua допускается и имеется возможность изменения типа значенияТип значения ты изменить не сможешь. Можно изменить тип переменной. Значение это строка или число, которые ты написал в код. Ты никак не скажешь компилятору "вот тебе число, но интерпретируй его как строку". Число есть число, строка есть строка. А вот переменная будет иметь тип согласно последнему присвоенному значению, т.к. Луа - динамический ЯП. Поэтому в нем нет приведения типов на уровне языка (о чем кстати ты и говоришь), они реализованы в виде функций toTYPE и, как ты сказал, весьма в ограниченном виде. Но это не то, о чем я говорил. Продолжить? или этого достаточно?На твое усмотрение, подискутировать я всегда могу. Изменено 16 Октября 2015 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
FonSwong 33 Опубликовано 17 Октября 2015 Поделиться Опубликовано 17 Октября 2015 @FonSwong, абсолютно бессмысленные оболочки непонятно зачем (сделанные) и для чего, это просто нагромождение, хлам если хочешь.Оболочки сделаны для более удобного вызова, так как в них сразу проверки на пустоту и тд.Спасибо за наводки Ссылка на комментарий
Serge! 127 Опубликовано 18 Октября 2015 Поделиться Опубликовано 18 Октября 2015 Никогда не мог подумать, что для постоянных посетителей этого ресурса требуется какой-то ликбез по терминологии в области программирования. Однако последние станицы показали, что некоторым такое будет полезно. Заодно и сам кое-что освежил. Переменная — поименованная, либо адресуемая область памяти, адрес которую можно использовать для осуществления доступа к данным. Данные, находящиеся в переменной (то есть по данному адресу памяти), называются значением этой переменной.В некоторых языках переменная определяется как имя, с которым может быть связано значение, или даже как место для хранения значения.Важно понимать разницу между именем переменной и значением этой переменной, и не забывать о ней.Значение, к которому привязана переменная (значение переменной) может быть объектом любого типа (допустимого синтаксисом), который может быть возвращен выражением.Например (для Lua):local tbl - это переменнаяаlocal tbl = () - это значение, к которому привязана переменная tbl. Это значение имеет тип table, а сама переменная (tbl) в отрыве от контекста присваивания никакого значения не имеет (nil в терминах Lua). Типы значения привязанные к переменным могут быть любые определённые синтаксисом компилятора.Отсюда вытекает, что нет никакой возможности проверять или переопределять типы самих переменных (их просто не существует), а можно выполнить проверку или преобразование только для значений, привязанных к этим переменным. Причем, при этом подразумевается не изменение типа значения (это невозможно по определению), а просто привязывание определённой ранее переменной к значению другого типа.В тоже время выражениеvar == {}является вполне допустимым (хоть и не имеющим никакого практического смысла) не смотря на то, что конструкция {} не привязана ни к какой переменной, но всё равно является вполне корректной для Lua, т.к. является ссылкой на область памяти под размещение массива (таблицы) и поэтому реальна, а, следовательно, не определяется компилятором как nil или ошибка. Это так называемая "повисшая" ссылка или "дырка", которая напрасно расходует ресурсы, но не вызовет вылетов. С ней позже разберётся сборщик мусора.Поэтому проверка переменных на их существование и проверка значений, привязанных к этим переменным, на наличие (пустоту) и тип - это всё суть разные понятия и действия.Объект, в понятиях "Сталкера", это нечто более аморфное, чем простые типы Lua и его рассмотрение потребует значительного времени и места. Поэтому пока оставим это. Да и к тому же форум "Скриптование" не самое подходящее место для подобных словопрений. Ссылка на комментарий
FonSwong 33 Опубликовано 19 Октября 2015 Поделиться Опубликовано 19 Октября 2015 (изменено) Не получается вывести рандомное значение из таблицы, ругается на аргумент tbl_sos = {} for id, human in pairs(db.creature) do if human then local npc = level.object_by_id(id) if npc~=nil and npc:alive() then if poisk.npc_will_help(npc,db.actor) then end end end end -- в npc_will_help идёт проверка по условиям и в таблицу записываются ид нпс через tbl_sos[npc:id()] = "SOS" local abc = tbl_sos[math.random(#tbl_sos)] log1(abc) Изменено 19 Октября 2015 пользователем FonSwong Ссылка на комментарий
Charsi 440 Опубликовано 19 Октября 2015 Поделиться Опубликовано 19 Октября 2015 @FonSwong, оператор # применяется к индексированным массивам, а у тебя tbl_sos - ассоциативный. 1 Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
RayTwitty 492 Опубликовано 19 Октября 2015 Поделиться Опубликовано 19 Октября 2015 (изменено) @FonSwong, если есть расширения RvP - используй функцию random для таблиц. Если нет, напиши сам - создай индексированный массив из ключей таблицы tbl_sos и выбери рандомный айди, а по нему уже получи значение из tbl_sos. Изменено 19 Октября 2015 пользователем RayTwitty Ссылка на комментарий
FonSwong 33 Опубликовано 19 Октября 2015 Поделиться Опубликовано 19 Октября 2015 (изменено) Сделал просто через индексированный. Расширение RvP что это и с чем едят, объясните по простому, пожалуйста И как соорудить ассоциативный Изменено 19 Октября 2015 пользователем FonSwong Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти