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

Язык 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
Ссылка на комментарий
Вот, черт возьми, как-то раньше и не приходилось сталкиваться. А тут выяснилось.
В общем для тех, кто ещё не попадался на этом.
Я всегда считал, что при работе со строками, подобные записи :
x = s:match('pattern')
-- и
x = string.match(s, 'pattern')

эквивалентны.

 
Оказывается нет. В первом случае 's' обязана быть строкой.
А во втором не обязательно. В функции 'string.match' (не проверял, но по ходу и в других должно быть также)
производится попытка преобразования 's' в строку.
Теперь использовать обращение к методу буду с осторожностью.
Изменено пользователем Nazgool
  • Спасибо 3
  • Согласен 1
  • Полезно 1
Ссылка на комментарий

Вопрос следующего характера - как в Lua можно грамотно экранировать символ "\"? Чтобы при совпадении с "n" не получался символ перехода на следующую строку ("\n"). Это нужно например в окнах с режимом ComplexMode.

 

Пока сделал такой вариант

string.gsub(s, "\\", "/")
но, наверно можно придумать что-то поизящнее... Изменено пользователем Shadows
Ссылка на комментарий

Чтобы при совпадении с "n"

Не понял, т.е. есть типа строки yes\no?

Если есть строка "positive\negative" и надо именно в таком виде и выводить, то придется заменять двумя слешами. А два слеша в коде это или [[\\]] или "\\\\". Т.е. твой же вариант только

string.gsub(s, "\\", "\\\\")
Минус очевиден, замена будет всех слешей, даже тех, кто не при чем. Поизящнее? Использовать регулярные выражения.

Вот, вдруг натолкнет на умные мысли.

PS: тут или править исходные данные, если они более менее статичны, или заменять что то плохое на что то хорошее, больше никак.

ТЧ 1.0004. SAP и Trans mod

github

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

т.е. есть типа строки yes\no?

Да.

 

если они более менее статичны

Данные не статичны, а постоянно меняются.

 

На самом деле оказалось, что внутри режима ComplexMode, идет поиск символа "\\n". Пробовал заменить его на символ с одним слешем - в итоге в строке его вообще не оказалось. Видимо, остается просто использовать мой первый вариант.

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

идет поиск символа "\\n"

Вот прямо с двумя слешами?

Надо четко представлять, что на самом деле находится в строке.

на символ с одним слешем - в итоге в строке его вообще не оказалось

Эм, так это, новая строка же, ну или какой другой спец символ. string.gsub(s, "\\n", "\n") - в результирующей строке ты не найдешь слеша.

Ты же в курсе, что слеш - знак экранирования? Чтобы написать слеш в строку, надо написать 2 слеша в коде и т.п.

PS: возможно я опять что не понял :)

ТЧ 1.0004. SAP и Trans mod

github

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

@Desertir, да тут наверно уже вопрос не Lua, а чисто сталкерских заморочек и парсинга строки в режиме ComplexMode.

http://www.lua.org/cgi-bin/demo
print("vasya\new")
||
\/

vasya
ew

print("vasya\\new")
||
\/

vasya\new

Второй вариант работает нормально в Lua, но в сталкере он также расценивается как перенос на следующую строку. Так что видимо ничего лучше обратного слеша не придумать в моем случае.

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

Да также второй вариант печатает и в игре - 'vasya\new'.

У меня по крайней мере. Правда стоит lua by RvP. Может и поэтому ???

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

Да также второй вариант печатает и в игре - 'vasya\new'.

В окне (статике) в режиме ComplexMode?

st = CUIStatic()
st:Init(0, 0, 1024, 768)
st:SetText("vasya\\new")
st:SetTextComplexMode(true)
get_hud():AddDialogToRender(st)

Правда стоит lua by RvP. Может и поэтому ???

Не могу знать, но не думаю что как-то влияет это расширение. Изменено пользователем Shadows
Ссылка на комментарий

Попробуй

st:SetText([[vasya\new]])

Это конечно то же самое что и "vasya\\new", но SetTextComplexMode явно работает не так как в lua.

Хотелось бы исключить все (нормальные) варианты.

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

Что сказать? Видимо строка разбирается в С, а не в lua.
Ничего тут не сделаешь, кроме как переписывать в движке.

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

Что-то задумался:

А есть ли вариант захвата типа (%b()), но для случая, когда искомых () может быть, а может и не быть (и быть что-то другое, которое и захватывать надо иначе) ?

 

Это все к тому же вопросу об xr_logic.parse_infop()

 

Соблазнительно разрешить в аргументах пробелы.

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

" +test( 34: 55 56 : 57:66 ) -test1 +test2(test0 )"

 

Мне, пожалуйста,

+, test, 34: 55 56 : 57:66

-, test1

+, test2, test0

 

для 2-й строки третьим захватом можно хоть nil, хоть "" - без разницы.

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


for sgn, fn, args in s:gmatch("([%+%-])([%w_]+)%s*%(?([^%)%+%-]*)") do

print(sgn, fn, args)

end

 

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

А проверить ? Если б работало - не спрашивал бы.

 

В общем, я посмотрел на получающееся у меня

for v1, v2, v3 in string.gfind( s, "(%S)([^%s%(%-%+%~%=%!]+)%s*%(?([^%)%-%+%~%=%!]*)%)?" ) do

 

и понял, что лучше таки в два приема, с

for v1, v2 in string.gfind( s, "(%S)([^%-%+%~%=%!]+)" ) do

...else

v1, v2 = string.match( v2, "([^%s%(]+)%s*%(?([^%)]*)" )

Если v1 == "=" или "!".

Так, пожалуй, все-таки и быстрее, и вменяемее.

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

@Charsi, для полного соответствия ТЗ я бы добавил ещё одну строчку. Я не знаю зачем @Dennis_Chikin нужны были запятые для разделения захватов, но раз обозначил такое условие, то пусть он их и получит.

local str = "+test( 34: 55 56 : 57:66 ) -test1 +test2(test0)"
for sgn, fn, args in str:gmatch("([%+%-])([%w_]+)%s*%(?([^%)%+%-]*)") do
    sgn = fn ~= '' and sgn..',' or sgn; fn = args ~= '' and fn..',' or fn 
    print(sgn, fn, args)
end
Изменено пользователем Murarius
Ссылка на комментарий

Доброго времени суток Комрады! Вопрос, выполнится ли тело if'a?

...
local bool = false
if not bool then
какой-то кода
end
... 

 

 

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

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

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

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

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

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

Войти

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

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

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