Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
13.7.2014, 8:11
Сообщение
#1001
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
MIKHAIL, как-то вы коряво описываете ситуацию..
Попробуйте подробнее, в примерах.. И что это за фигурные скобки там? |
|
|
13.7.2014, 9:42
Сообщение
#1002
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Код assert(loadstring("tData = {\"some_data\"}"))()
print(tData[1]) -- some_data |
|
|
1.8.2014, 3:17
Сообщение
#1003
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Допустим загружается код:
Код local str = "copying" local tbl = {[1] = "one_more_copying"} local tData = { [1] = 1, [str] = str, [tbl[1]] = tbl[1] } Здесь главное – это таблица со своими переменными в момент "формирования". Только первый элемент таблицы в моём понимании изначально "жёстко" задан. Остальные два элемента таблицы копируются. Вопрос: как вообще можно перехватить эти события копирования последних двух элементов таблицы (ключи и значения)? Предполагаю, что как-то через адреса ячеек в памяти . |
|
|
1.8.2014, 15:04
Сообщение
#1004
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Это делается при помощи метатаблицы:
Код local str = "copying"
local tbl = {[1] = "one_more_copying"} local tData = { [1] = 1 } setmetatable(tData, { __newindex = function(self, key, value) print(key, value) -- печатаем устанавливаемые ключ и значение rawset(self, key, value) -- непосредственная установка значения end }) tData[str] = str tData[tbl[1]] = tbl[1] |
|
|
2.8.2014, 13:15
Сообщение
#1005
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Но если данные определены уже внутри самой таблицы, вот так:
Код local tData = { [1] = 1, [str] = str, [tbl[1]] = tbl[1] } то перехватить события копирования последних двух элементов таблицы никак нельзя, или это довольно объёмная, но решаемая задача? |
|
|
3.8.2014, 12:40
Сообщение
#1006
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Перехватить копирование откуда и куда?
Метод метатаблицы __newindex отвечает за вставку в таблицу данных для НОВОГО ключа. Другими словами, если ключ в таблице уже существует, то присвоение этому ключу нового значения НЕ повлечет за собой вызов метода __newindex. Пример: Код local str = "copying" local tData = { [1] = 1 } setmetatable(tData, { __newindex = function(self, key, value) print(key, value) rawset(self, key, value) end }) tData[str] = str -- сработает метод __newindex, так как в таблице нет ключа str tData[str] = "str" -- метод __newindex НЕ сработает, так как в таблице уже есть ключ str Вариант обхода этого - это присвоение значения nil: Код tData[str] = str -- сработает метод __newindex, так как в таблице нет ключа str tData[str] = nil -- затираем предыдущее значение tData[str] = "str" -- сработает метод __newindex, так как в таблице нет ключа str Другой вариант (возможно более грамотный) - это хранить данные не в текущей таблице, а в таблице метатаблицы : Код local str = "copying"
local tData = {} setmetatable(tData, { tTable = {}; -- таблица для хранения данных __newindex = function(self, key, value) print(key, value) getmetatable(self).tTable[key] = value end; __index = function(self, key) return getmetatable(self).tTable[key] end; }) tData[1] = 1 tData[str] = str tData[str] = "str" |
|
|
4.8.2014, 1:35
Сообщение
#1007
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Перехватить копирование откуда и куда? Попробую объяснить подробнее. Допустим, есть файл с таким содержанием: Код local str = "copying" local tbl = {[1] = "one_more_copying", [2] = "and_one_more"} local tData = { [1] = 1, -- в моём понимании задано жёстко безо всяких ссылок на другие переменные [2] = "Миша", -- здесь тоже задано жёстко безо всяких ссылок на др. переменные ["eyes"] = "grey", -- и здесь задано жёстко безо всяких ссылок на др. переменные [str] = str, -- а вот это есть ссылка на другую переменную и мне надо "отловить" изменение ключа и его значение [tbl[1]] = tbl[1], -- и это есть ссылка на др. переменную и мне тоже надо "отловить" изменение ключа и его значение [tbl[2]] = str -- и здесь... вообщем изменения любых ключей и их значений по ссылкам на другие переменные } Файл загружается и выполняется обработка содержания таблицы tData. Так вот, мне (как ни странно это звучит) необходимо узнать, где внутри этой таблицы произошло изменение ключа и его значения по ссылке. Самое главное – это то, что нужные для отлова данные описаны внутри самой таблицы. Но не такой вариант: Код local str = "copying" local tbl = {[1] = "one_more_copying", [2] = "and_one_more"} local tData = { [1] = 1, [2] = "Миша", ["eyes"] = "grey" } tData[str] = str tData[tbl[1]] = tbl[1] tData[tbl[2]] = str но и за этот вариант благодарю, буду иметь в виду реализацию для такого случая. |
|
|
4.8.2014, 10:18
Сообщение
#1008
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Ничего непонятно.
В Lua по ссылке передаются только table, function, thread и userdata Строки не передаются по ссылке, а копируются! Код local str = "str"
local t = {[1] = "test"} local tData = { [str] = str, ["t"] = t } print(tData["t"][1]) -- "test" t[1] = "test1" print(tData["t"][1]) -- "test1", так как таблица t передана по ссылке в таблицу tData print(tData[str]) -- "str" str = "str1" print(tData[str]) -- nil, так как в таблице tData нет ключа "str1" (строки всегда копируются) |
|
|
14.1.2015, 19:51
Сообщение
#1009
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Пытаюсь сделать функцию локальной.
При указании Код local SerializeToString = function(tTable, sTableName, sTab) ... выбивает ошибку attempt to call global 'SerializeToString' (a nil value) в момент рекурсивного вызова. Ошибку понимаю, но не секу почему есть разница с... (далее по тексту). Добавляю выше по коду Код local SerializeToString SerializeToString = function(tTable, sTableName, sTab) ... работает как и Код local function SerializeToString(tTable, sTableName, sTab) ... т. е. как и положено. Всегда думал, что эти записи эквивалентны, и, думаю, что оно так и есть. Но в данном случае почему-то переменная не спешит стать локальной (да и глобальной не стала) и приходится дописывать чуток "лишнего" текста.) Вопрос: есть свои нюансы в моменты вышеуказанных определений, или где-то я не догоняю?.. |
|
|
14.1.2015, 20:30
Сообщение
#1010
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
MIKHAIL,
А зачем вы стараетесь обязательно сделать local ? |
|
|
14.1.2015, 23:39
Сообщение
#1011
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
MIKHAIL, А зачем вы стараетесь обязательно сделать local ? В соответствии с основными методами оптимизации lua-кода: "1) Доступ к локальным переменным в Lua несколько быстрее, чем к глобальным." |
|
|
14.1.2015, 23:50
Сообщение
#1012
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
MIKHAIL,
Ну нельзя же всё воспринимать настолько прямолинейно! Вы же не собираетесь сохранять таблицы с частотой 1000 герц и продолжительное время...Только тогда это ваше "local" даст вам заметную прибавку производительности.. |
|
|
15.1.2015, 0:02
Сообщение
#1013
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
|
|
|
15.1.2015, 10:24
Сообщение
#1014
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
когда ты пишешь
Код local function SerializeToString(tTable, sTableName, sTab) ты сразу определяешь имя функции, и это имя может сразу использоваться внутри функции но когда ты пишешь Код local SerializeToString = function(tTable, sTableName, sTab) ты сначала определяешь анонимную функцию (функцию без имени), выполняешь её, и только потом присваиваешь переменной SerializeToString эту функцию. То есть присвоение происходит уже после выполнения тела анонимной функции, поэтому если в теле используется переменная SerializeToString, то она еще не определена: Код local f1 = function()
print(f1) end local function f2() print(f2) end f1() -- nil f2() -- function: 0x803f00 |
|
|
2.4.2015, 19:51
Сообщение
#1015
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Например, в строке:
Код local s = 'здесь заменить вторую "з"' зная положение буквы "з" как s:sub(7,7), заменить только её без процедуры разрезания и склеивания как-то по-кашернее возможно? |
|
|
2.4.2015, 21:59
Сообщение
#1016
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
MIKHAIL, тут лёгких путей нет.
Вот есть другой путь (тоже не простой, но без разрезания, хотя расчленение присутствует - фразу разбираем посимвольно, заносим их в таблицу по отдельности, заменяем конкретную позицию и выкладываем обратно фразу в собранном виде): Код local s = 'здесь заменить 2-ю букву "з"'
local z,n,t = "z",0,{} -- "z" - тут для примера ("з" будем менять на "z") Core.SendToAll("1. "..s) -- первоначальная фраза if s:sub(7,7) == "з" then for S in string.gmatch(s, ".") do n = n + 1 t[n] = S if n == 7 then t[n] = z end end s = table.concat(t) end Core.SendToAll("2. "..s) -- результат |
|
|
2.4.2015, 23:50
Сообщение
#1017
|
|
Абсолютный новичок Группа: Пользователи Сообщений: 1 Регистрация: 26.8.2010 Пользователь №: 7 570 Спасибо сказали: 2 раза |
Код local p = 7
local s = 'здесь заменить вторую "з"' Core.SendToAll (("%s%s%s"):format(s:sub(1,p-1), "z", s:sub(p+1))) |
|
|
3.4.2015, 0:11
Сообщение
#1018
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Ksan, наверное, 7?
Код if n == 4 then
|
|
|
3.4.2015, 3:30
Сообщение
#1019
|
|
Белый Волк Группа: Пользователи Сообщений: 1 723 Регистрация: 11.9.2008 Из: г.Томск Пользователь №: 516 Спасибо сказали: 657 раз |
MIKHAIL,
Да, 7 (для вашего случая). Просто я проверял с другой фразой, и забыл подменить цифру на подходящую под приведённый код. Поправил. Vag_starter, Да, так короче и проще! Век живи, век учись. Хотя тут тоже разрезание и склеивание, только скрытое и на лету.. |
|
|
10.4.2015, 12:31
Сообщение
#1020
|
|
KEEP CLEAR AT ALL TIMES Группа: Пользователи Сообщений: 141 Регистрация: 4.9.2011 Из: Беларусь, Минск Пользователь №: 9 667 Спасибо сказали: 3 раза |
Скрипт №1 (script1.lua) работает с таблицей tCatalog подключенного модуля require("catalog"):
catalog.lua Код module("catalog") SetData = function(key,value) if not tCatalog then tCatalog = {} else tCatalog[key] = value end end GetData = function() return tCatalog end А вот в скрипте №2 (script2.lua) тоже с подключенным одноименным модулем require("catalog"), пытаясь запросить уже созданную скриптом №1 таблицу с данными, её попросту не "видно"... Прошу помощи, товарищи, по открытию области видимости, но только без сохранения данных в файл с последующим dofile(). |
|
|
Похожие темы
|
Сейчас: 23.11.2024, 8:31 |