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

Язык 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
Ссылка на комментарий

@Nazgool а это уже не простой способ. О чем я и написал. Это уже изменение всех скриптов, которые используют db.actor. Изменение большого кол-ва скриптов = новые ошибки. Так-то варианты и другие есть, разной степени сложности. Я же под простым способом подразумевал такой, который полностью совместим с существующими скриптами. А вообще, это проблема не стоит усилий, затраченных на ее решение.

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

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

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

 

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

@Nazgool это как раз нормальный вариант. Вот только сходу не нашел, на что заменить. Да брось, не стоит оно затраченных усилий. Я прекратил эксперименты на эту тему, т.к. есть более приоритетные задачи. Просто отписался для тех, кто будет искать информацию на эту тему.

 

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

dsh

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

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

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

Ну и когда (и зачем) успели запретить операцию local s = "1"; local v = s + 0 ? И что теперь делать с 7 314 115 байт когда ?

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

@Dennis_Chikin странный код. В чем его смысл? Это что бы tonumber() не делать? А чем tonumber() плох?

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

Тем, что существуют мегатонны кода с операциями string + number.

И ладно, "+ 0" "+0" найти можно поиском.   А если там не пробел, или не 0 ?

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

@Dennis_Chikin овнокод, очевидно, нужно переписывать. У меня, кстати

local s  = "1"
local v  = s + 0
local v2 = v + 2
log3( "dsh: v = %d, v2 = %d", v, v2 )

выводит

dsh: v = 1, v2 = 3

Т.ч. не могу сказать, что я понял проблему. Впрочем, у меня и 

--LUA version: [LuaJIT 2.0.5]

 

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

@Dennis_Chikin это вроде обыкновенный 1.0006 с мелкими двоичными врезками в рендер. Сомневаюсь, что там какие-то изменения в lua. Максимум, может быть RVP подключен или как оно там называется.

 

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

Отладчик ругается на такого вида переменные:

local myvar = game_graph():vertex
local lastGvid = 3131

for i = 1, lastGvid do
  myvar(i)
end
  

Отладчик пишет: "В строке 1 ожидается список аргументов функции, а написано local", но такой код работает:

function my(x)
  return x
end
local myvar = my
print(myvar(12)) -- 12

С методами так нельзя?

*Замечу game_graph():vertex() -- тип функция

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

@Graff46 

local gg = game_graph()
local myvar = gg.vertex
local lastGvid = 3131

for i = 1, lastGvid do
  myvar(gg, i)
end

 

  • Нравится 1
Ссылка на комментарий

Методы нельзя так приравнивать, отладчик прав. Проверил на ×ZeroBrain

Скрины:

Скрытый текст

6533e6e1b742000fbd14b688abebc95f.png0045cfca876f276fadb46e61da0d95b2.pngaf04ba05ac89ffad14288199b0f3dcd1.png

 

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

Используй не game_graph():vertex, а game_graph().vertex (через точку). В этом случае ты делаешь не вызов функции, а обращение к полю объекта

  • Нравится 1

Freedom

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

Вопрос по метатаблицам

local data=setmetatable({},{
		__tostring = function() return "data_table_name" end,
	})

log("1 "..tostring(data))
data={["dsdsd"]=true}
log("2 "..tostring(data))

Вывод

1 data_table_name

2 0A0EC4C8

т.е. при инициализации таблицы новыми данными ее метатаблица затирается.

если делать setmetatable после инициализации - не вызываются _index,__newindex. каким образом можно избежать такого эффекта? очень не хочется писать отдельные циклы заполнения таблицы с метаданными...

p.s. все это вызывается из под движка ТЧ 1.0007

 

p.s.s. само собой, можно написать и так:

local data=setmetatable({["dsdsd"]=true},{
		__tostring = function() return "data_table_name" end,
	})

но все равно не вызываются события _index,__newindex у таблицы data.

Изменено пользователем Winsor
Ссылка на комментарий
16 минут назад, Winsor сказал:

 


data={["dsdsd"]=true}

т.е. при инициализации таблицы новыми данными ее метатаблица затирается.

Это не инициализация таблицы новыми данными. Это присваивание новой таблицы, у которой нет метатаблицы.

Инициализация данными вот:

data["dsdsd"]=true
Изменено пользователем abramcumner
Ссылка на комментарий
17 минут назад, abramcumner сказал:

Это присваивание новой таблицы, у которой нет метатаблицы.

т.е. без какого то лишнего шага не обойтись?

например, псевдокод:

rawdata={["dsdsd"]=true}

setmetatable(data,{__index,__newindex})

copy(data,rawdata)

 

 

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

Ну я особо лишних шагов тут не вижу. Создаешь таблицу с метатаблицей, вставляешь в нее данные.

Можно так написать:

setmetatable(data,{__index,__newindex})

copy(data,{["dsdsd"]=true})

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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