Arslan
@AmelianceSkyMusic, Почему бы тебе не попробовать написать калькулятор-парсер? Одну теорию в голове не удержишь нужна практика
Arslan
Калькулятор-парсер в смысле разбор строки типа: "5+5"
Ivan
У луа и php, конкатенация и оператор сложения _намеренно_ разделены, чтобы не было как в JS:
бывают языки где и операторы сравнения разные для строк и чисел
Ameliance
@AmelianceSkyMusic, Почему бы тебе не попробовать написать калькулятор-парсер? Одну теорию в голове не удержишь нужна практика
так я написал библиотеку создания кнопок, и на ее основе скрипт - палитру цветов для покраски треков, а как работает так и не понял😅
Snusmumriken
Единственное, что тебе сейчас нужно знать — метатаблица меняет свойства таблиц, к которым она прицеплена, с помощью специальных полей. Это — наиболее краткая и полная информация. Больше ничего знать не нужно, разве что только конкретные поля. И всё.
Ameliance
хочу понять что такое метатаблица изначально вообще, что бы понять что я к ней добавляю... то есть если я ложу в коробку что-то мне непонятное, то мне интерестно узанть что обычно в коробке лежит
Snusmumriken
Метатаблица — это такая же таблица как и обычные. В неё только добавили специальных полей, и указали как управляющую. Это всё. Метатаблица это обычная таблица, и ничего больше.
Snusmumriken
Да.
Snusmumriken
У тебя есть два чувака. Одному ты выдал инструкций, как и за что пинать второго, и сказал ему что он теперь начальник второго. Теперь второй обращается к начальнику, когда от него хотят странного, и спрашивает: "а как мне поступить?".
Snusmumriken
setmetatable(подчинённый, начальник) Начальник содержит инструкции в __инструкция.
Snusmumriken
setmetatable(чувак, {__инструкция = blabla}) — мы создаём начальника, посмотри фигурные скобки.
Arslan
Чуваки, начальники. Вот это я понимаю объяснил
Snusmumriken
a = setmetatable({}, {__index = foo}) == a = {} b = {__index = foo} setmetatable(a, b) == a = {} setmetatable(a, {__index = foo}) Посмотри внимательно. Все три образца кода в целом делают одно и то же. В первом случае — мы создаём начальника и подчинённого на месте, и тут же отправляем в функции. В третьем — создаём начальника на месте, и цепляем к подчинённому.
Snusmumriken
Ну можно и так сказать
Ameliance
Ну можно и так сказать
то есть метатаблица это не что-то определенно, а чисто область хранения и пока туда ничего не положить она пустая? а если ложить то так? setmetatable(куда_положить, __что_делать_с_положенным = что_положить)
Snusmumriken
Ты упорно в setmetatable пихаешь вторым аргументом что-то странное.
Snusmumriken
Там должна быть ТАБЛИЦА
Snusmumriken
{__что_делать = что_то}
Snusmumriken
Или заранее созданная таблица.
Snusmumriken
Ещё внимательнее.
Ameliance
это tab1 = {} tab2 = {} setmetatable(tab1, {__index = tab2}) == setmetatable(таблица_куда_положить, {__искать_значения_в_доп_таблице = доп_таблица}) ?
Snusmumriken
setmetatable(a, {__index = foo}) скобочка^ скобочка^ Две скобочки вместе дают таблицу. Которая в setmetatable указывается начальником для первой таблицы.
Ameliance
Ты упорно в setmetatable пихаешь вторым аргументом что-то странное.
да я понял кажись, может неправильно выразился, вот сверху пример👆🏻
Snusmumriken
Вот, да
Snusmumriken
Потому что дитё сначала ищет проблему в себе, и только потом в других ))
Ameliance
Спасибо тебе за терпение, если что)
Snusmumriken
Не хочешь чтобы искало в себе — просто не заполняй дитё, пусть будет пустой таблицей.
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 не добавляет ключи в детей-подчинённых. Там хитрая схема, метатаблица не оставляет видимых следов.
Ameliance
Нет, setmetatable не добавляет ключи в детей-подчинённых. Там хитрая схема, метатаблица не оставляет видимых следов.
как же я могу тогда отображать ключи детей, изменять их не влияя на родителей?
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
что тут происходит? как он меняет свой ключ (которого нет), который он ищет у родителя, но с тем же самым родительский остается таким каким и был
Snusmumriken
А ты смотри что в функции turn_off )) Он добавляет себе ключ и значение. Не родителю, а себе.
Ameliance
Snusmumriken
Ну вот superlamp:turn_off() добавил ключ switch к superlamp, и superlamp перестала искать его у lamp.
Ameliance
А ты смотри что в функции turn_off )) Он добавляет себе ключ и значение. Не родителю, а себе.
ааа... то есть вызывая функцию он отправляет себя и не просто меняет положение к ключа, а сразу его и добавляет.... получается одними и теми же функциями можно добавлять таблице какие-то значения... причем можно сразу управлять имим...хм🤔
Snusmumriken
Ага.
Ameliance
вот она какая... наследственность
Snusmumriken
На самом деле, в родителях обычно хранятся только функции. Если детям нужны слегка модифицированные функции — ты их им дописываешь модифицированными.
Snusmumriken
Там же можно хранить свойства для всех детей. И если каким-то из детей нужны особые — ты дописываешь им свои.
Snusmumriken
Snusmumriken
Привет @limonovakarina, как забрели в такую глушь?
Timur
(кстати, интересная методика - если спамера и ботовода первым спросить, у него/неё сломается скрипт?)
Timur
сейчас посмотрим
Snusmumriken
Не должен, за спам в чаты и приём сообщений должны отвечать разные подсистемы.
Ameliance
Ameliance
Snusmumriken
Ничо, ничо. Попробуй убрать все сокращения и лишние функции, разбирать будет немножко проще.
Ameliance
Ничо, ничо. Попробуй убрать все сокращения и лишние функции, разбирать будет немножко проще.
на вызов функции self не работает и нужно посылать саму таблицу?
Ameliance
Ameliance
упростил... идем дальше)