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

Язык Lua. Общие вопросы программирования


Malandrinus

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

, 

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Попробуй

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

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

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

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

Поделиться этим сообщением


Ссылка на сообщение
Позволю и себе высказать мнение о проверке на nil в примере Kober(BRUC).

Считаю что такая проверка абсолютно бесполезна.

Ну хорошо. db.actor не nil. Остается 7 типов значений (перечислять не буду)

Как это поможет, если db.actor окажется, например, числом? К этому числу будет применен метод position, ну или какой другой. Результат всё равно не изменить. Крах.

 

Тут просто, видимо, разработчики предполагали что при наявности actor-a в таблице db обязательно будет создано поле actor, и его значением обязательно будут данные actor-а.

Значит достаточно проверить:

есть данные этого поля - есть actor

нет данных - нет actor-а

 

Поэтому руководствуясь "пишем в коде то, чего требуем", для этого случая достаточно проверки if db.actor then ...

Именно это и требуется - проверка на то, что там есть реальные(не nil, а прицепом и не false) данные.

 

Другое дело, когда очень хочется сравнить с чем-то, то вместо сравнения с nil, гораздо полезнее поставить сравнение с типом "userdata". Так вариантов для прокола станет намного меньше.

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

Поделиться этим сообщением


Ссылка на сообщение

Говорим про nil, а Desertir напомнил про неэквивалентность. Вот я и вспомнил, хотя уже когда-то писал:

Запись :

function x()
    return
end

не эквивалентна :

function y()
    return nil
end

Вроде бы и одинаковы :

print(x()==nil) --> true
print(y()==nil) --> true

Но :

print(select('#', x())) --> 0
print(select('#', y())) --> 1

в первом случае void, во втором nil - как совершенно определенный тип значения

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

А вот тут хочу подискутировать

Да тут и дискутировать особо не о чем. Только теория.
Практическое использование подобного не встречал, да и на граблей на этой основе тоже.
Это так, из раздела "Занимательная наука" ))

Поделиться этим сообщением


Ссылка на сообщение
print(say_tbl[data])

И ещё, math.randomseed ничего не возвращает, поэтому записывать в переменную data нечего.

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

Поделиться этим сообщением


Ссылка на сообщение

Замени

language = 'eng'
...
if language == 'ru'
...
elseif language == 'eng'
  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

@Dennis_Chikin, Ещё с момента публикации хотел спросить, - "И зачем это нужно в принципе?"
Я к чему. Все уже давно привыкли, что если нет ни того ни другого, то будет nil.

И когда я так напишу, то и буду ожидать что 'p' станет 'nil'-ом. А оно не станет.

Такое многим не понравиться.

Lua stalker-а и без этого сильно не предсказуема.

Хотя-я-я. В этом же стиле. Так что можно. :)

 

А-а-а. Чего пишу-то. Пишу любителям SciTE.

Замутил тут одну штуку. Давно хотел, да плевал, а тут вот ""з`явилася нагода".

В общем добавил в меню 'Tools" выбор разных версий lua и быстрое переключение на эти версии с изменением подсветки синтаксиса и т.д.

Дело в том, что все актуальные версии для платформ x86 и x64 у меня есть, а вот для luajit 1.1.5 есть только одна. На x86 у меня работает, значит нет для x64 (я имею в виду бинарники).

Может у кого-то завалялась?

Другие версии JIT (1,1,6-1,1,8) не интересуют.

 

Да, если кому-то это нужно в SciTE, то милости прошу. Доделаем как это будет нужно и в конце концов правильно.

А то леплю тут как придется :)
 

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

Поделиться этим сообщением


Ссылка на сообщение

Это аналог require(module_name) из академического.. lua.

Идет подгрузка модуля(файла) с именем module_name.

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

Поделиться этим сообщением


Ссылка на сообщение

Доводилось использовать несколько версий lua ТЧ а также стандартные 5.1 - 5.3
Различий не замечал.
А записи абсолютно эквивалентны.
"k" и "v" (да как угодно их называй) - это локальные переменные внутри цикла.
Функция "pairs (t)" в любой версии (по крайней мере использованных мною) возвращает три значения - функцию next, таблицу t и nil.
Т.е.

for k, v in pairs(t) do

можно переписать как:

for k, v in next,t,nil do

И теперь видно, что мы имеем дело с функцией "next"
Т.е. твой вопрос переадресовывается от функции "pairs" к функции "next"
Впрочем и за next-ом различных версий я тоже ничего криминального не замечал, т.е. она как возвращала два значения, так и возвращает.

Те самые "k" и "v" . А как ты их будешь использовать - это сугубо твоё дело. Хоть "k" и "_" , хоть "_" и "v" , хоть только "k".

Поделиться этим сообщением


Ссылка на сообщение

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

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

Поделиться этим сообщением


Ссылка на сообщение

dsh

Всё просто кажется сложным. На самом деле обычно не хватает времени разобраться.
А дела обстоят так.

Действительно, у таблицы 'db' существует метаблица, которая посредством метаметода '__index' ссылается на глобальную таблицу '_G'.
Поэтому совершенно естественно, что при запросе несуществующего поля таблицы 'db', поиск поля с таким именем происходит в таблице, на которую указывает '__index'.
Т.е. в таблице '_G'
И это не прихоть игры, таковы законы Lua.
Любой модуль (module) при указании 'package.seeall' будет искать "недостающие" поля в таблице '_G'.
И избавиться от такого поведения (как вы говорите) можно совершенно стандартными способами Lua.

Для это существую стандартные функции Lua - rawget и rawset.
Т.е. давайте перепишем Ваш пример так:

rawset(db, 'actor_test',nil)
_G.actor_test = "shit"

И теперь напечатайте:

log3( "dsh: actor_test = %s", tostring( rawget(db.actor_test))

 

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

Поделиться этим сообщением


Ссылка на сообщение

Ну если так не подходит, то тогда (по степени сложности) нужно подумать над тем, чтобы переписать функцию '__index'.

Как следующий в цепочке ивентов. Или тоже не вариант?

 

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

Поделиться этим сообщением


Ссылка на сообщение

dsh

Да для меня написать подобный код - не проблема.
Печально только что никому сейчас это не нужно :(

Да что там... давно уже никому не нужно.

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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