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

Язык 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
36 минут назад, _Призрак_ сказал:

Используй не game_graph():vertex, а game_graph().vertex (через точку)

Так работает!d2ae398a8caaab1bcaa7c57f821a6d74.png

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

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 пользователей

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