如何覆盖Lua类中的元表的__tostring?

时间:2019-07-29 16:19:21

标签: lua tostring

我上了这个课:

math.randomseed(os.time())
local Die = {}

function Die.new(side)
  if side ~= 4 or side ~= 6 or side ~= 8 or side ~= 10 or side ~= 12 or side ~= 10 or side ~= 100 then
    side = 6
  end
  ran = math.random(side)       -- had to get the value before placing in table
  local self = { numSides = side, currentSide = ran}

  local getValue = function(self)
    return self.currentSide
  end

  local roll = function(self)
    self.currentSide = math.random(self.numSides)
  end

  local __tostring = function(self) 
    return "Die[sides: "..self.numSides..", current value: "..self.currentSide.."]" 
  end

  return {
    numSides = self.numSides,
    currentSide = self.currentSide,
    getValue = getValue,
    roll = roll,
    __tostring = __tostring
  }
end

return Die

例如,我的目标是当我使用print(dieOne)行时,使__tostring打印出数据。目前,我的__tostring无法正常工作,但是我很确定我正在尝试以错误的方式进行操作。

我该如何实现?谢谢!

1 个答案:

答案 0 :(得分:2)

__tostring条目必须存在于从Die.new返回的每个实例的元表中。当前,您仅将其存储为普通条目。您可以通过以下方法确保将其正确保存在每个关联的元表中:

function Die.new(side)
  -- as before...

  -- setup the metatable
  local mt = {
    __tostring = __tostring
  }

  return setmetatable({
    numSides = self.numSides,
    currentSide = self.currentSide,
    getValue = getValue,
    roll = roll,
  }, mt)
end

在这里,我们利用setmetatable不仅具有其名称所暗示的含义,而且还返回第一个函数参数。

请注意,无需调用函数本身__tostring。只有元表键必须为"__tostring"