Вопрос:

Новые значения в таблицах - общие?

lua

25 просмотра

1 ответ

476 Репутация автора

вопрос

Пытаясь узнать, luaя случайно обнаружил, что если

a = {"a"}
b = a

чем это производит (не удивительно):

a
{"a"} --[[table: 0x046bde18]]
b
{"a"} --[[table: 0x046bde18]]

но тогда, если:

a[2] = "b"

почему до a == bсих пор true?

a
{"a", "b"} --[[table: 0x046bde18]]
b -- this is a surprise
{"a", "b"} --[[table: 0x046bde18]]

Похоже, что это работает в обоих направлениях: если новое значение назначено, bто оно также будет назначено a.

С другой стороны, если я присваиваю aзначение (пример:), a = 1а b = aзатем, если aзначение изменяется ( a = 2), то bсохраняет исходное значение (все еще b = 1).

Вопросов

  1. Почему это поведение отличается в зависимости от того, aявляется ли массив / таблица или значение? Это из-за встроенных метатаблиц ( __newindex)?
  2. Какова цель такого поведения массивов / таблиц?
  3. Что если бы я хотел / должен был как-то отделиться aи b(или что делать, если я хотел сохранить значения aдо изменения b)?

(Я прочитал главы Lua Assignment and Metatables и Metamethods Справочного руководства Lua, но до сих пор не понимаю, почему такое поведение происходит.)

Автор: Siemkowski Источник Размещён: 01.02.2017 04:44

Ответы (1)


2 плюса

10142 Репутация автора

Решение

В вашем примере aи bприведены только ссылки на одну и ту же таблицу. В Lua таблицы являются объектами, и вы создали таблицу и присвоили ее aс помощью первого оператора, а затем создали вторую ссылку на ту же таблицу со вторым назначением. Итак, оба a[2] = "b"и b[2] = "b"действуют на одну и ту же базовую таблицу (таблица: 0x046bde18).

Таблица не является значением, это объект. a = {"a"}создает таблицу и присваивает ссылку на таблицу с a. b = aназначает ту же ссылку на b. Но, x = 10присваивает значение 10для x. Если y = 10и вы могли бы изменить основную ценность 10, я полагаю, что это изменение будет отражено в обоих xи y, но я не знаю ни одного очевидного способа сделать это. В этом коде:

x = 10
y = 10
y = y + 1

результирующие значения будут x = 10, и y = 11. Базовая стоимость 10не изменилась, но yбыла переназначена на стоимость 11.

Если вы хотите работать с двумя копиями таблицы , которые могут изменяться независимо друг от друга, вам нужно будет написать функцию , которая копирует член aINTO b = {}. Вот вопрос, который обсуждает создание копий таблиц .

Автор: David Bowling Размещён: 01.02.2017 04:50
Вопросы из категории :
32x32