Перейти к публикации
Форум - ComputerCraft
  • 0
kiru883

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

Вопрос

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

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

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


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

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

  • 0

Пример:

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
  • Like 3

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


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

....

 

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

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

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


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

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

local a = {}

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

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

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

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


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

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

 

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

 

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

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

 

Конструкцию вида 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
  • Like 2

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


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

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

 

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

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

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

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


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

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

 

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

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×