Луа: Как я могу получить необработанную строку в метаметоде __tostring? - PullRequest
0 голосов
/ 27 августа 2018

код ниже:

local t = {}
setmetatable(t, {__tostring = function(self) return 'MyTable is: '..tostring(self) end})
print(t)

выполнение кода приведет к ошибке: «Переполнение стека C».Поскольку в метаметоде __tostring tostring (self) будет вызывать метаметод __tostring, это мертвый цикл.

Есть ли способ получить необработанную строку со значением "t"?

1 Ответ

0 голосов
/ 27 августа 2018

Чтобы сделать то, что вы пытаетесь сделать из Lua, вам в основном нужно сбросить метатабель из основной таблицы, затем вызвать на нем tostring, а затем вернуть метатабель обратно.Например:

setmetatable(t, {__tostring = function(self)
  local temp = getmetatable(self)
  setmetatable(self, nil)
  local ret = 'MyTable is: ' .. tostring(self)
  setmetatable(self, temp)
  return ret
end,
})

Также обратите внимание, что метафункция __tostring должна возвращать строку, а не просто печатать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...