Перейти к содержимому
  • 0
kiru883

Вопрос по таблицам

Вопрос

Рассмотрите следующий код: а = {}; а.а = а Что будет значением а.а.а.а? Какое-либо а в этой последовательности как-то отличается от остальных? Теперь добавьте следующую строку к предыдущему коду: а.а.а.а = 3 Что теперь будет значением а.а.а.а?

  объячните максимально понятно просидел 4 часа над этим

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Пример:

local a = { x = 10 }
a.a = a
print(a.x)
print(a.a.x)
print(a.a.a.x)
print(a.a.a.a.x)

Если ты попробуешь запустить этот код - ты получишь четыре десятки.

Конструкция a.a = a создает в таблице a поле с ключом a которое в качестве значения ссылается на саму таблицу a.

Поэтому когда интерпретатор Луа начинает выполнять код, любая цепочка вида a.a(.a) сведется в конце концов просто к таблице a.

 

Теперь добавим строку а.а.а.а = 3:

local a = { x = 10 }
a.a = a

a.a.a.a = 3
print(a.x)
print(a.a)
print(a.a.x)

Мы получим последовательно число 10, число 3 и ошибку.

Поле a в таблице a было переопределено, и теперь содержит ссылку не на таблицу a, а на константу 3.

Поэтому конструкция a.a теперь равняется трём, и любая попытка продлить цепочку (типа a.a.a) будет приводить к ошибке индексации, потому что нельзя получить поле по ключу из числа (конструкция 3.a не имеет смысла).

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

....

 

Сколько перечитывал ничего не понимал, вы как боги луа пожалуйста, объясните на пальцах как работает конструкция а.а.а.а, не понятен функционал а.а = а от слова СОВСЕМ. Просто объясните на пальцах как для дибила

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сколько перечитывал ничего не понимал, вы как боги луа пожалуйста, объясните на пальцах как работает конструкция а.а.а.а, не понятен функционал а.а = а от слова СОВСЕМ. Просто объясните на пальцах как для дибила

local a = {}

a["a"]["a"]["a"]["a"] = 3

4 a - это просто ключ, знаешь что такое хэш таблица?

Изменено пользователем NEO

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сколько перечитывал ничего не понимал, вы как боги луа пожалуйста, объясните на пальцах как работает конструкция а.а.а.а, не понятен функционал а.а = а от слова СОВСЕМ. Просто объясните на пальцах как для дибила

 

Тебе надо разобраться что такое таблицы и как они работают, прежде чем углубляться в разные головоломки. =)

 

Таблица в Луа - это коллекция данных в формате ключ = значение.

В таблицу можно положить что-то под конкретным ключом, и достать что-то по конкретному ключу.

 

Конструкцию вида t.key = value можно по другому записать как t["key"] = value. Это как раз операция которая используется для того чтобы положить что-то в таблицу. t тут - таблица, key это ключ, а value - это значение которое ты кладешь в таблицу.

 

Для того чтобы потом получить значение value обратно, используется другая операция - извлечение по ключу.

Выглядит так: t.key. Или еще можно записать так: t["key"]. Это одно и то же.

 

Когда ты пишешь a.a = a, это эквивалентно a["a"] = a. То есть в ячейку таблицы с ключом "a" кладется ссылка на саму таблицу a.

В Lua на одну таблицу может ссылаться несколько переменных из разных мест. Дубликатов при этом не создается, все переменные на самом деле работают с одной и той же таблицей. В том что ячейка таблицы может ссылаться на саму эту же самую таблицу тоже ничего необычного нет. Это допустимо.

 

Когда ты пишешь цепочку типа a.a.a.a, из предыдущего примера, происходит вот что:

* Lua вычисляет все по очереди, слева направо. Если поставить скобки для понятности, то оно будет выглядеть так: ((a.a).a).a.

* Lua смотрит на первое звено: a.a. Это то же самое что a["a"]. Это операция получения значения из таблицы по ключу. Где таблица называется a, и ключ называется "a". Поскольку перед этим мы положили в ячейку "a" таблицы a ссылку на саму эту таблицу, то операция a["a"] возвращает эту ссылку. То есть a.a можно упростить просто до a. В конце концов ты сам перед этим написал, что a.a = a.

* После упрощения получается такая конструкция: ((a).a).a) или просто (a.a).a. Lua берет следующую пару a.a и делает то же самое - упрощает ее просто до a. Остается (a).a или a.a. А это, как мы помним равняется просто a.

 

Таким образом, если a.a = a, то какую бы длинную цепочку мы не писали, Lua упростит ее до просто a.

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
30.08.2018 в 01:06, kiru883 сказал:

Рассмотрите следующий код: а = {}; а.а = а Что будет значением а.а.а.а?

 

30.08.2018 в 15:34, Kirrru сказал:

Сколько перечитывал ничего не понимал, вы как боги луа пожалуйста, объясните на пальцах как работает конструкция а.а.а.а,

Только сейчас заметил, что человек спрашивал с двух разных аккаунтов. Что это было?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 часов назад, eu_tomat сказал:

Только сейчас заметил, что человек спрашивал с двух разных аккаунтов. Что это было?

 

Палево мультиакка. )

Кстати, учитывая что сервера у нас больше нет, мультиакки все еще под запретом? Или уже пофигу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...