Arslan
@AmelianceSkyMusic, Почему бы тебе не попробовать написать калькулятор-парсер? Одну теорию в голове не удержишь нужна практика
Arslan
Калькулятор-парсер в смысле разбор строки типа: "5+5"
Ivan
Arslan
Ameliance
Snusmumriken
Единственное, что тебе сейчас нужно знать — метатаблица меняет свойства таблиц, к которым она прицеплена, с помощью специальных полей.
Это — наиболее краткая и полная информация. Больше ничего знать не нужно, разве что только конкретные поля. И всё.
Ameliance
хочу понять что такое метатаблица изначально вообще, что бы понять что я к ней добавляю... то есть если я ложу в коробку что-то мне непонятное, то мне интерестно узанть что обычно в коробке лежит
Snusmumriken
Метатаблица — это такая же таблица как и обычные. В неё только добавили специальных полей, и указали как управляющую. Это всё. Метатаблица это обычная таблица, и ничего больше.
Ameliance
Snusmumriken
Да.
Snusmumriken
У тебя есть два чувака.
Одному ты выдал инструкций, как и за что пинать второго, и сказал ему что он теперь начальник второго.
Теперь второй обращается к начальнику, когда от него хотят странного, и спрашивает: "а как мне поступить?".
Ameliance
Snusmumriken
setmetatable(подчинённый, начальник)
Начальник содержит инструкции в __инструкция.
Snusmumriken
setmetatable(чувак, {__инструкция = blabla}) — мы создаём начальника, посмотри фигурные скобки.
Arslan
Чуваки, начальники. Вот это я понимаю объяснил
Snusmumriken
a = setmetatable({}, {__index = foo})
==
a = {}
b = {__index = foo}
setmetatable(a, b)
==
a = {}
setmetatable(a, {__index = foo})
Посмотри внимательно. Все три образца кода в целом делают одно и то же.
В первом случае — мы создаём начальника и подчинённого на месте, и тут же отправляем в функции.
В третьем — создаём начальника на месте, и цепляем к подчинённому.
Ameliance
Snusmumriken
Ну можно и так сказать
Ameliance
Ну можно и так сказать
то есть метатаблица это не что-то определенно, а чисто область хранения и пока туда ничего не положить она пустая?
а если ложить то так?
setmetatable(куда_положить, __что_делать_с_положенным = что_положить)
Snusmumriken
Ты упорно в setmetatable пихаешь вторым аргументом что-то странное.
Snusmumriken
Там должна быть ТАБЛИЦА
Snusmumriken
{__что_делать = что_то}
Snusmumriken
Или заранее созданная таблица.
Snusmumriken
Snusmumriken
Ещё внимательнее.
Ameliance
это
tab1 = {}
tab2 = {}
setmetatable(tab1, {__index = tab2})
==
setmetatable(таблица_куда_положить, {__искать_значения_в_доп_таблице = доп_таблица})
?
Snusmumriken
setmetatable(a, {__index = foo})
скобочка^ скобочка^
Две скобочки вместе дают таблицу.
Которая в setmetatable указывается начальником для первой таблицы.
Snusmumriken
Вот, да
Ameliance
Snusmumriken
Потому что дитё сначала ищет проблему в себе, и только потом в других ))
Ameliance
Спасибо тебе за терпение, если что)
Snusmumriken
Не хочешь чтобы искало в себе — просто не заполняй дитё, пусть будет пустой таблицей.
Ameliance
Ameliance
function extended(Child, Parent)
setmetatable(Child,{__index = Parent})
end
{__index = Parent} — это таблица с таблицей?
Snusmumriken
Ага
Ameliance
а зачем двойная таблица?
Snusmumriken
Начальник, который указывает дитю искать недостающее в Parent
Snusmumriken
В Parent можно добавить поле Parent.__index = Parent, тогда его самого можно будет указывать начальником: инструкция для подчинённых появилась.
Ameliance
Child = {a=10, b=20}
Parent = {c = 30}
function extended(Child, Parent)
setmetatable(Child,{__index = Parent})
end
extended(Child, Parent)
-->
Child = {a=10, b=20, {__index = Parent = {c = 30}}
?
Snusmumriken
Нет, setmetatable не добавляет ключи в детей-подчинённых. Там хитрая схема, метатаблица не оставляет видимых следов.
fgntfg
Ameliance
Snusmumriken
Изменять ключи родителей — например вот так
getmetatable(Child).__index.c = 20
Или сразу:
Parent.c = 20
Ameliance
я имею в виду если родитель не добавляет ключей с ,то как я могу его менять у детеныша, если у него нет ключа с
Snusmumriken
Ты добавишь ключ в ребёнка, и больше не получишь доступ к ключу родителя.
Snusmumriken
Перекрывание такое.
Ameliance
то есть если я вызову из метатаблицы ключ от родителя, то после изменения он перелетит к детёнышу?
Snusmumriken
Нет ))
Ameliance
ух...😅
Snusmumriken
Если ты укажешь детёнышу такой же ключ — родительский не изменится, и ты потеряешь к нему доступ из ребёнка, разве что через getmetatable его можно будет получить.
Snusmumriken
parent = {key1 = 10, key2 = 20}
child = {key1 = 30}
setmetatable(child, {__index = parent})
print(child.key1) --> 30 -- свой
print(child.key2) --> 20 -- родительский
parent.key2 = 50 -- меняем родительский
print(child.key2) --> 50 -- ребёнок адаптируется
-- добавляем поле с тем же именем к ребёнку
child.key2 = 100 -- теряем доступ к родительскому
print(child.key2) --> 100 -- свой
print(parent.key2) --> 50
-- child = {key1 = 30, key2 = 100}
-- parent = {key1 = 10, key2 = 50}
Snusmumriken
Ничего никуда не летает. Но если ты вручную добавляешь ключ ребёнку (child.key2 = 100) — ребёнок перестаёт искать его у родителя: у него появился свой ключ, ему теперь незачем его искать у родителя. Но все остальные отсутствующие ключи будут продолжать искаться у родителя.
Ameliance
Snusmumriken
Вот да, близко.
Ameliance
так почему меняется у дитеныша, если у него нет этого ключа, а он ищет его у родителя всегда?
Snusmumriken
Ну ды ))
Нет ключа — ищем по __index. Оно же не копируется, а типа одалживается у родителя.
Ameliance
Ameliance
не, не стоп
Ameliance
что тут происходит?
как он меняет свой ключ (которого нет), который он ищет у родителя, но с тем же самым родительский остается таким каким и был
Snusmumriken
А ты смотри что в функции turn_off ))
Он добавляет себе ключ и значение. Не родителю, а себе.
Ameliance
Snusmumriken
Ну вот superlamp:turn_off() добавил ключ switch к superlamp, и superlamp перестала искать его у lamp.
Snusmumriken
Ага.
Ameliance
вот она какая... наследственность
Snusmumriken
На самом деле, в родителях обычно хранятся только функции. Если детям нужны слегка модифицированные функции — ты их им дописываешь модифицированными.
Snusmumriken
Там же можно хранить свойства для всех детей. И если каким-то из детей нужны особые — ты дописываешь им свои.
Snusmumriken
Snusmumriken
Привет @limonovakarina, как забрели в такую глушь?
Timur
(кстати, интересная методика - если спамера и ботовода первым спросить, у него/неё сломается скрипт?)
Timur
сейчас посмотрим
Snusmumriken
Не должен, за спам в чаты и приём сообщений должны отвечать разные подсистемы.
Ameliance
Ameliance
Snusmumriken
Ничо, ничо. Попробуй убрать все сокращения и лишние функции, разбирать будет немножко проще.
Ameliance
Ameliance
Ameliance