我上了这个课:
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
无法正常工作,但是我很确定我正在尝试以错误的方式进行操作。
我该如何实现?谢谢!
答案 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"
。