myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
53 страниц V  « < 49 50 51 52 53 >  
Ответить в данную темуНачать новую тему

> Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы)

Ksan
сообщение 13.7.2014, 8:11
Сообщение #1001


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 723
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 657 раз




MIKHAIL, как-то вы коряво описываете ситуацию..
Попробуйте подробнее, в примерах..
И что это за фигурные скобки там?
Go to the top of the page
+Quote Post
Setuper
сообщение 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


Спасибо сказали:
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 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]
}

Здесь главное – это таблица со своими переменными в момент "формирования".
Только первый элемент таблицы в моём понимании изначально "жёстко" задан. Остальные два элемента таблицы копируются.
Вопрос: как вообще можно перехватить эти события копирования последних двух элементов таблицы (ключи и значения)? Предполагаю, что как-то через адреса ячеек в памяти what.gif.
Go to the top of the page
+Quote Post
Setuper
сообщение 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]


Спасибо сказали:
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 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]
}

то перехватить события копирования последних двух элементов таблицы никак нельзя, или это довольно объёмная, но решаемая задача?
Go to the top of the page
+Quote Post
Setuper
сообщение 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


Другой вариант (возможно более грамотный) - это хранить данные не в текущей таблице, а в таблице метатаблицы big_smile.gif :
Код
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"


Спасибо сказали:
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 4.8.2014, 1:35
Сообщение #1007


KEEP CLEAR AT ALL TIMES
****

Группа: Пользователи
Сообщений: 141
Регистрация: 4.9.2011
Из: Беларусь, Минск
Пользователь №: 9 667
Спасибо сказали: 3 раза




Цитата(Setuper @ 3.8.2014, 11:40) *
Перехватить копирование откуда и куда?


Попробую объяснить подробнее. Допустим, есть файл с таким содержанием:
Код
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

но и за этот вариант благодарю, буду иметь в виду реализацию для такого случая.
Go to the top of the page
+Quote Post
Setuper
сообщение 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" (строки всегда копируются)


Спасибо сказали:
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 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)
...

т. е. как и положено.

Всегда думал, что эти записи эквивалентны, и, думаю, что оно так и есть. Но в данном случае почему-то переменная не спешит стать локальной (да и глобальной не стала) и приходится дописывать чуток "лишнего" текста.)
Вопрос: есть свои нюансы в моменты вышеуказанных определений, или где-то я не догоняю?..
Go to the top of the page
+Quote Post
Ksan
сообщение 14.1.2015, 20:30
Сообщение #1010


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 723
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 657 раз




MIKHAIL,
А зачем вы стараетесь обязательно сделать local ?
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 14.1.2015, 23:39
Сообщение #1011


KEEP CLEAR AT ALL TIMES
****

Группа: Пользователи
Сообщений: 141
Регистрация: 4.9.2011
Из: Беларусь, Минск
Пользователь №: 9 667
Спасибо сказали: 3 раза




Цитата(Ksan @ 14.1.2015, 19:30) *
MIKHAIL,
А зачем вы стараетесь обязательно сделать local ?

В соответствии с основными методами оптимизации lua-кода: "1) Доступ к локальным переменным в Lua несколько быстрее, чем к глобальным."
Go to the top of the page
+Quote Post
Ksan
сообщение 14.1.2015, 23:50
Сообщение #1012


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 723
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 657 раз




MIKHAIL,
Ну нельзя же всё воспринимать настолько прямолинейно!
Вы же не собираетесь сохранять таблицы с частотой 1000 герц и продолжительное время...Только тогда это ваше "local" даст вам заметную прибавку производительности.. big_smile.gif
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 15.1.2015, 0:02
Сообщение #1013


KEEP CLEAR AT ALL TIMES
****

Группа: Пользователи
Сообщений: 141
Регистрация: 4.9.2011
Из: Беларусь, Минск
Пользователь №: 9 667
Спасибо сказали: 3 раза




Цитата(Ksan @ 14.1.2015, 22:50) *
MIKHAIL,
Ну нельзя же всё воспринимать настолько прямолинейно!
Вы же не собираетесь...

Не собираюсь сегодня – соберусь завтра... Но это уже на втором плане.
На первом плане: я столкнулся с чем, что я не могу сам себе объяснить. Прошу помощи у тех, кто сможет помочь.
Go to the top of the page
+Quote Post
Setuper
сообщение 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


Спасибо сказали:
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 2.4.2015, 19:51
Сообщение #1015


KEEP CLEAR AT ALL TIMES
****

Группа: Пользователи
Сообщений: 141
Регистрация: 4.9.2011
Из: Беларусь, Минск
Пользователь №: 9 667
Спасибо сказали: 3 раза




Например, в строке:
Код
local s = 'здесь заменить вторую "з"'

зная положение буквы "з" как s:sub(7,7), заменить только её без процедуры разрезания и склеивания как-то по-кашернее возможно?
Go to the top of the page
+Quote Post
Ksan
сообщение 2.4.2015, 21:59
Сообщение #1016


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 723
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 657 раз




MIKHAIL, тут лёгких путей нет. big_smile.gif
Вот есть другой путь (тоже не простой, но без разрезания, хотя расчленение присутствует - фразу разбираем посимвольно, заносим их в таблицу по отдельности, заменяем конкретную позицию и выкладываем обратно фразу в собранном виде):
Код
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)  --  результат


Спасибо сказали:
Go to the top of the page
+Quote Post
Vag_starter
сообщение 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)))


Спасибо сказали:
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 3.4.2015, 0:11
Сообщение #1018


KEEP CLEAR AT ALL TIMES
****

Группа: Пользователи
Сообщений: 141
Регистрация: 4.9.2011
Из: Беларусь, Минск
Пользователь №: 9 667
Спасибо сказали: 3 раза




Ksan, наверное, 7?
Код
if n == 4 then
Go to the top of the page
+Quote Post
Ksan
сообщение 3.4.2015, 3:30
Сообщение #1019


Белый Волк
*********

Группа: Пользователи
Сообщений: 1 723
Регистрация: 11.9.2008
Из: г.Томск
Пользователь №: 516
Спасибо сказали: 657 раз




MIKHAIL,
Да, 7 (для вашего случая). Просто я проверял с другой фразой, и забыл подменить цифру на подходящую под приведённый код.
Поправил.

Vag_starter,
Да, так короче и проще! Век живи, век учись. big_smile.gif
Хотя тут тоже разрезание и склеивание, только скрытое и на лету..
Go to the top of the page
+Quote Post
MIKHAIL
сообщение 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().
Go to the top of the page
+Quote Post

53 страниц V  « < 49 50 51 52 53 >
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No new ВАЖНО: Topic has attachmentsМодули для скриптов RusHub
26 Setuper 45 545 21.3.2017, 17:31 Посл. сообщение: Alexey
No new ВАЖНО: Topic has attachmentsВаши Вопросы И Предложения По Поводу Форума
447 Svyat 324 797 20.10.2015, 19:39 Посл. сообщение: Ksan
No New Posts От: Вопросы Разработчикам Скриптов
От темы с ID: 173
0 MIKHAIL 4 357 23.1.2015, 0:56 Посл. сообщение: MIKHAIL
No new Topic has attachmentsВопросы по протоколу NMDC
Делаю программу
26 Master255 29 977 12.1.2015, 0:38 Посл. сообщение: Master255
No New Posts Вопросы к Phazeus по Экзекутору
Мастер может забанить мастера, как решить в Экзекуторе?
1 AndreiDC 5 408 31.10.2014, 19:20 Посл. сообщение: Ksan
No New Posts От: Установка скриптов
От темы с ID: 5657
0 MIKHAIL 4 825 29.7.2014, 23:37 Посл. сообщение: MIKHAIL
No New Posts Установка скриптов
Нужна помощь по установке
2 _wRz_ 7 352 29.7.2014, 16:11 Посл. сообщение: Артём
No new От: Вопросы Разработчикам Скриптов
От темы с ID: 173
29 Wariner 26 183 28.1.2014, 13:11 Посл. сообщение: Alexey
No new Topic has attachmentsВопросы по RusHub
Технические вопросы
316 Jaska 270 709 19.12.2013, 13:59 Посл. сообщение: mod
No new Topic has attachmentsМелкие вопросы
44 Wariner 51 222 19.9.2013, 12:34 Посл. сообщение: Alexey
No New Posts От: Ваши Вопросы И Предложения По Поводу Форума
От темы с ID: 753
3 anila 9 189 28.3.2013, 16:02 Посл. сообщение: настя
No New Posts Единая платформа для скриптов
Обсуждения вопроса создания единой платформы скриптов
5 Enyby 9 103 18.1.2012, 20:15 Посл. сообщение: Setuper
No new Topic has attachmentsПеределка скриптов
Прошу помощи
47 Fe(one)X 41 683 26.12.2011, 15:04 Посл. сообщение: Ksan
No new Topic has attachmentsВопросы Разработчикам Скриптов с SQL
вопросы по скриптам (мелкие вопросы)
101 Wariner 63 001 6.12.2011, 0:34 Посл. сообщение: Enyby
No New Posts От: Вопросы по RusHub
От темы с ID: 2902
4 Otshelnik-Fm 8 530 19.10.2011, 9:23 Посл. сообщение: Mangust

 



RSS Сейчас: 23.12.2024, 15:37