@Fuduin

[Lua] Почему таблица внутри метатаблицы считается «статичной»?

Файл Object.lua
local base = _G

module("Object")

local CObject = {
	position = {
		x = 0,
		y = 0
	},
	text = "Some text"
}

function new()
	local res = {}
	base.setmetatable(res, { __index = CObject })

	return res
end


Файл main.lua
require("Object")

local object1, object2

object1 = Object.new()
object2 = Object.new()

object1.text = "qwerty"
object2.text = "asdfg"

print(object1.text) -- выведет qwerty
print(object2.text) -- выведет asdfg

object1.position.x = 1
object2.position.x = 2

print(object1.position.x) -- выведет 2
print(object2.position.x) -- выведет 2


Вопрос: почему если внутри метатаблицы есть таблица, то она ведет себя как "статичное поле", а другие элементы нет? Что я делаю не так?
  • Вопрос задан
  • 2730 просмотров
Решения вопроса 1
@Fuduin Автор вопроса
Скорее всего это происходит из-за того, что вся работа с таблицами происходит по ссылке. Поэтому, когда идет обращение к position (для любой таблицы с метатаблицей CObject) к нам в руки попадает ссылка на таблицу position которая была создана еще в таблице CObject.

Пока в качестве решения придумал следующее, таблицу в метатаблице объявить как nil и создать функцию которая будет переопределять position как таблицу и внесить туда все значения.

Если есть более адекватные решения пишите, буду рад. Ниже код файла Object.lua

local base = _G

module("Object")

local CObject = {
	position = nil,
	text = "Some text"
}

function CObject:init()
	self.position = {}
	self.position.x = 0
	self.position.y = 0
end

function new()
	local res = {}
	base.setmetatable(res, { __index = CObject })
	res:init()

	return res
end
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы