Size: a a a

2020 April 22

ШТ

Шмель Тяжеловес in pro.lua
Ameliance SkyMusic
в книге увидел, пришла мысль что так можно...
t1 = {1, 2, 3, 4, 5}
t2 = {}
q = {}
print(q[1])
setmetatable(q, t2)
print(q[1])
t2.__index = tbl
print(q[1])
выведет
nil
nil
1
источник

A

Ameliance SkyMusic in pro.lua
Шмель Тяжеловес
t1 = {1, 2, 3, 4, 5}
t2 = {}
q = {}
print(q[1])
setmetatable(q, t2)
print(q[1])
t2.__index = tbl
print(q[1])
выведет
nil
nil
1
то что выводит nil я и так увидел из своего кода, вопрос у меня почему... то есть так нельзя в принципе никогда писать?
setmetatable(megalamp, lamp)
источник

A

Ameliance SkyMusic in pro.lua
что происходит если вызвать эту функцию?setmetatable(megalamp, superlamp)
можно ли ее как-то перефразировать по другому, то есть что она из себя представляет изнутри?
источник

I

Igor725 in pro.lua
setmetable не имеет альтернатив на уровне lua, она добавляет метаметоды из метатаблице к твоей таблице, которую ты передаёшь первым аргументом. Метатаблица - это такая штука, которая может содержать в себе переопределения операторов, к прмеру или ключ индексирования, который будет ссылаться на таблицу, в которой Lua будет искать ключи при обращении к оригинальной таблице, которой назначена метатаблица.
источник

A

Ameliance SkyMusic in pro.lua
пока просто в моей логике я посылаю 2 таблицы и она одну привязывает к другой в качестве метатаблицы
источник

I

Igor725 in pro.lua
local meta = {
__mul = function(a, b)return a.val * b end
}

local mytab = setmetatable({val = 10}, meta)
print(mytab * 5)
-- вернёт 50
источник

I

Igor725 in pro.lua
Это переопределение оператора умножения для таблицы
источник

I

Igor725 in pro.lua
Полный список метаметодов есть в документации
источник

I

Igor725 in pro.lua
когда ты указываешь в метатаблице ключ __index и даёшь ему значение с ссылкой на саму метатаблицу, ты говоришь интерпрератору, что когда происходит обращение к методу оригианльной таблицы, его нужно искать в метатаблице
источник

I

Igor725 in pro.lua
local meta = {
test = function(a, b)return a.val * b end
}
meta.__index = meta
local mytab = setmetatable({val = 10}, meta)
print(mytab:test(5))
источник

IB

Ivan Bessarabov in pro.lua
Прочитай книгу =) Там все очень подробно рассказывается что такое метатаблицы, зачем они, что можно с ними делать.
источник

IB

Ivan Bessarabov in pro.lua
источник

I

Igor725 in pro.lua
Почти тоже самое, что в первом варианте, но без переопределния метаметода умножения, создаётся функция test внутри метатаблицы, к которой происходит обращение из основоной таблицы
источник

I

Igor725 in pro.lua
Про них как раз лучше почитать, да, а то судя по вопросам вообще нет понимания, что такое метатаблицы и с чем их едят
источник

A

Ameliance SkyMusic in pro.lua
Igor725
setmetable не имеет альтернатив на уровне lua, она добавляет метаметоды из метатаблице к твоей таблице, которую ты передаёшь первым аргументом. Метатаблица - это такая штука, которая может содержать в себе переопределения операторов, к прмеру или ключ индексирования, который будет ссылаться на таблицу, в которой Lua будет искать ключи при обращении к оригинальной таблице, которой назначена метатаблица.
чем отличается
lamp.__index = lamp
setmetatable(superlamp, lamp)

от
setmetatable(superlamp, {__index = lamp})
источник

I

Igor725 in pro.lua
Тем, что во втором варианте в метатаблице ссылка будет на другую таблицу и с помощью неё будет индексироваться superlamp
источник

I

Igor725 in pro.lua
В обоих случаях индексация происходит через таблицу lamp, но во втором создаётся ещё одна, которая является только метстаблицей и не является индексируемой
источник

I

Igor725 in pro.lua
Во втором случае метатаблица может содержать только метаметоды, если проще говорить
источник

I

Igor725 in pro.lua
Вам проще прочитать PiL, тогда всё встанет на свои места, там объясняется подробнее
источник

A

Ameliance SkyMusic in pro.lua
Igor725
Во втором случае метатаблица может содержать только метаметоды, если проще говорить
я читал несколько мест, но как я понял в некоторых статьях были ошибки (к примеру статья Луа за 60 минут) и я немного запутался😅

теперь пытаюсь понять где...
источник