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

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

 

 

Почему тебе следующий вариант не нравится?
function isBool(value)
    type(value) == 'boolean'
end

да хотя-бы потому, что это не рабочий вариант. Вы сами то попробовали её запустить? Я попробовал, у меня не получилось ее даже в SciTE запихнуть. Ругается. А так все нормально, все буковки правильные.

Вам не кажется, что это уже в простой трёп переходит? Я же Вам ничего не советовал. Вы правильно дианостировали ошибку в том фрагменте кода (там еще был метод find применённый к таблице, хотя обычно применяется для строк, но я не претендую на эксперта Lua и его расширений для Сталкера - возможно такое применение и корректно. Но у меня в _G такого метода для таблиц нет). 

И так можно перебрасываться очень долго, пока меня окончательно не забанят. По сему на этом всё.

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

Расшифруй.

Я о том, что type возвращает одну из строк

nil, boolean, number, string, userdata, function, thread, table

Они все известны, их конечное число и они описаны в доках, и мне непонятна фраза про непредсказуемые моменты. Всё вполне предсказуемо. Ну типы то надо знать... Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

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

 

 

Ну типы то надо знать...

Типы то я знаю, а вот Вы так и не поняли, что функуция проверяет не типы, а объекты. Ведь это две большие разницы, не правда ли? Или Вы и с этим не согласны?

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

@Desertir, там все ясно, он мне в личку отписал, он путает перевод в булево с проверкой существования переменной, причем с относительно НЕпустым значением.
Приведу цитату (просьба не притягивать за уши и опять меня в чем-то обвинять):

Неверно. Если такой объект существует (буть то функция, нить, userdata и т.д) она вернёт true, а если не существует (нет его в _G), то вернёт false. Все корректно.

Это никак не проверка типа на булево.

 

Если попробовать поискать что-то подобное у себя, то только такое могу предложить:

function is_correct(x) return not (is_false(x) or is_nil(x)) end

 Для toboolean у меня используется двойное отрицание, в таком виде lua безопасно переводит любой тип в булево значение, следует только учитывать при работе с нулем и единицей, их не переводит, они оба true, потому при работе с нулем как false следует это учитывать.

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

 

 

он путает перевод в булево с проверкой существования переменной

я не собираюсь ни в чем, никого обвинять, просто прошу напомнить где я говорил о "переводе в булево"? Может я что-то забыл, тогда я не прав. Я всё время твержу о проверке зачения объекта, а не его типа. Переименуйте функцию в thisObjIs(var) и забудьте про тип возвращаемого ею значения. Тогда может вопросы отпадут?

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

да хотя-бы потому, что это не рабочий вариант

Очевидно надо дописать return, про который я забыл, ошибка очень легко диагностируемая, появляется частенько если писать код быстро. У меня такое бывает, ошибаюсь. Вопрос только в том, почему для тебя это не очевидно?

Вам не кажется, что это уже в простой трёп переходит? Я же Вам ничего не советовал.

Нет, не кажется, я хочу помочь, однако советов я не давал, я только задавал вопросы. Несколько наводящие, но вопросы, чтобы ты сам постарался понять свою проблему.

что функуция проверяет не типы, а объекты

Конечно объекты, в Луа нет работы напрямую с типами, отчасти мета-таблицы, которые хоть немного привносят рефлексию. Это же скриптовый язык, он должен быть простым.

он путает перевод в булево с проверкой существования переменной

Ну ок. В JavaScript вообще все просто, написал два раза восклицательный знак вот и перевел в булево :)

используется двойное отрицание

Вот и я об этом.
  • Спасибо 1

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий
ты сам постарался понять свою проблему.

У меня конкретно в этом случае нет проблемы, это раз.
Два, в последний раз повторяю, я не проверяю типы, не пытаюсь перевести их в булево, а проверяю значение объекта на факт его существования и на то, что он не пустой (number не 0, string не "" и т.п.). И только результат такой проверки получаю в виде булевского значения. Других слов снять вашу зашторенность у меня просто нет, извините. Разве что переименуйте мысленно эту функцию из isBool(var) в thisIsObj(var) и тогда возможно станет понятнее моя цель.
А за вопросы, особенно наводящие, большое человеческое спасибо.

 

в Луа нет работы напрямую с типами

добавлю. И здесь Вы не правы. В Lua допускается и имеется возможность изменения типа значения, ограниченная правда, но имеется.
Примеры: 1. указанное Карлан двойное отрицание. 2. tonumber(var) - перевод в тип number. 3. tostring(var) - перевод в тип string.
Продолжить? или этого достаточно?
Ссылка на комментарий

Нужна помощь со строками

Нужно получить из строки(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

 

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

@FonSwong, захватываем всё, что после первого пробела и не относится к пунктуации.

local s = "! Волк, где ты?"
print(s:match("%s(%P*)")) --> печатает 'Волк'

@Serge!, продолжай.  :D

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

@FonSwong, документация по луа от Иерусалимского (не хочу ударятся в брюзжание, но надо читать шапку темы), там и про строки и про паттерны, а твой спойлер это жуть :)

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

@FonSwong, абсолютно бессмысленные оболочки непонятно зачем (сделанные) и для чего, это просто нагромождение, хлам если хочешь.

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

Разве что переименуйте мысленно эту функцию из isBool(var) в thisIsObj(var) и тогда возможно станет понятнее моя цель.

Я даже не знаю что на это сказать. Я понимаю, что тема была про проверку на существование и пустоту, но почему isBool? Это не просто неверное именование функции, это наименование для заблуждения читающего, случайное или намеренное - не важно. Важно то, что ты предоставил свой вариант общественности, и он весьма странный.

И здесь Вы не правы

Я про Фому, а ты мне про Ерёму. Я говорю о типах как о значениях.

В Lua допускается и имеется возможность изменения типа значения

Тип значения ты изменить не сможешь. Можно изменить тип переменной. Значение это строка или число, которые ты написал в код. Ты никак не скажешь компилятору "вот тебе число, но интерпретируй его как строку". Число есть число, строка есть строка. А вот переменная будет иметь тип согласно последнему присвоенному значению, т.к. Луа - динамический ЯП. Поэтому в нем нет приведения типов на уровне языка (о чем кстати ты и говоришь), они реализованы в виде функций toTYPE и, как ты сказал, весьма в ограниченном виде. Но это не то, о чем я говорил.

Продолжить? или этого достаточно?

На твое усмотрение, подискутировать я всегда могу. Изменено пользователем Desertir

ТЧ 1.0004. SAP и Trans mod

github

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

@FonSwong, абсолютно бессмысленные оболочки непонятно зачем (сделанные) и для чего, это просто нагромождение, хлам если хочешь.

Оболочки сделаны для более удобного вызова, так как в них сразу проверки на пустоту и тд.

Спасибо за наводки:)

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

Никогда не мог подумать, что для постоянных посетителей этого ресурса требуется какой-то ликбез по терминологии в области программирования. Однако последние станицы показали, что некоторым такое будет полезно. Заодно и сам кое-что освежил.

 

 

Переменная — поименованная, либо адресуемая область памяти, адрес которую можно использовать для осуществления доступа к данным. Данные, находящиеся в переменной (то есть по данному адресу памяти), называются значением этой переменной.
В некоторых языках переменная определяется как имя, с которым может быть связано значение, или даже как место для хранения значения.
Важно понимать разницу между именем переменной и значением этой переменной, и не забывать о ней.
Значение, к которому привязана переменная (значение переменной) может быть объектом любого типа (допустимого синтаксисом), который может быть возвращен выражением.
Например (для Lua):
local tbl - это переменная
а
local tbl = () - это значение, к которому привязана переменная tbl. Это значение имеет тип table, а сама переменная (tbl) в отрыве от контекста присваивания никакого значения не имеет (nil в терминах Lua). Типы значения привязанные к переменным могут быть любые определённые синтаксисом компилятора.
Отсюда вытекает, что нет никакой возможности проверять или переопределять типы самих переменных (их просто не существует), а можно выполнить проверку или преобразование только для значений, привязанных к этим переменным. Причем, при этом подразумевается не изменение типа значения (это невозможно по определению), а просто привязывание определённой ранее переменной к значению другого типа.
В тоже время выражение
var == {}
является вполне допустимым (хоть и не имеющим никакого практического смысла) не смотря на то, что конструкция {} не привязана ни к какой переменной, но всё равно является вполне корректной для Lua, т.к. является ссылкой на область памяти под размещение массива (таблицы) и поэтому реальна, а, следовательно, не определяется компилятором как nil или ошибка. Это так называемая "повисшая" ссылка или "дырка", которая напрасно расходует ресурсы, но не вызовет вылетов. С ней позже разберётся сборщик мусора.
Поэтому проверка переменных на их существование и проверка значений, привязанных к этим переменным, на наличие (пустоту) и тип - это всё суть разные понятия и действия.
Объект, в понятиях "Сталкера", это нечто более аморфное, чем простые типы Lua и его рассмотрение потребует значительного времени и места. Поэтому пока оставим это. Да и к тому же форум "Скриптование" не самое подходящее место для подобных словопрений.

 

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

Не получается вывести рандомное значение из таблицы, ругается на аргумент

 

 

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)

 

 

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

@FonSwong, оператор # применяется к индексированным массивам, а у тебя tbl_sos - ассоциативный.

  • Нравится 1
Ссылка на комментарий
@FonSwong, если есть расширения RvP - используй функцию random для таблиц. Если нет, напиши сам - создай индексированный массив из ключей таблицы tbl_sos и выбери рандомный айди, а по нему уже получи значение из tbl_sos. Изменено пользователем RayTwitty
Ссылка на комментарий

Сделал просто через индексированный.

 

 

Расширение RvP что это и с чем едят, объясните по простому, пожалуйста:)

И как соорудить ассоциативный

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

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

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

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

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

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

Войти

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

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

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