Lua function 获取数字时会获取不同的数据类型

我在 Lua 类中遇到了这个问题。这是我的类代码:

local Temp = {}

function Temp:new(tmp)
  local self = {temp = -273.15}
  if tmp > self.temp then
    self.temp = tmp
  end

  local setC = function(usrTmp)
    if usrTmp < -273.15 then
      self.temp = -273.15
    else
      self.temp = usrTmp
    end
  end

  local getC = function()
    return self.temp
  end

  local getF = function()
    return self.temp * 1.8 + 32
  end

  local getK = function()
    return self.temp + 273.15
  end

  return {
    setC = setC,
    getC = getC,
    getF = getF,
    getK = getK
  }
end

return Temp

这是我的主方法代码:

temp = require "tempClass"

io.write("请输入初始温度:")
usrTemp = io.read("*n")

myTemp = temp:new(usrTemp)

print("当前温度为摄氏度:".. myTemp:getC())
print("当前温度为华氏度:" .. myTemp:getF())
print("当前温度为开尔文度:" .. myTemp:getK())
io.write("请输入新的温度:")
changeTemp = io.read("*n")
myTemp:setC(changeTemp)
print("当前温度为摄氏度:" .. myTemp:getC())
print("当前温度为华氏度:" .. myTemp:getF())
print("当前温度为开尔文度:" .. myTemp:getK())
io.write("请输入新的温度:")

我的问题在 setC 函数的 if usrTmp < -273.15 then 行。我正在收到这个错误消息:

lua: ./tempClass.lua:10: attempt to compare table with number
stack traceback:
    ./tempClass.lua:10: in function 'setC'
    [string "<eval>"]:14: in main chunk

但我知道 usrTmp 是一个数字。如果在函数之前调用 type,则会返回 number 类型。在函数中,类型是 table。为什么 usrTmp 在函数中是一个表格?我该如何解决?谢谢!

点赞
用户9593596
用户9593596

当定义将使用 self 参数的函数时,需要明确指定 self 参数。函数 setC 应该有一个额外的 self 参数:

local setC = function(self, usrTmp)
  -- 与之前相同...
 end

请记住,以下两个调用是相同的:

myTemp:setC(changeTemp)
myTemp.setC(myTemp, changeTemp)

这应该能解释你收到的实际错误消息了。


另外,需要将 Table.new 转换为普通函数(不带 self 参数)。它还没有连接到任何实例,应该返回一个实例。最后,状态变量 temp 必须包含在 Table.new 返回的表中:

function Temp.new(tmp)
  -- 注意使用点号而不是冒号

  -- 与之前相同的函数体,但现在所有函数都需要使用 self 参数,如:
  local getC = function(self)
     return self.temp
  end

  return {
    temp = self.temp,
    setC = setC,
    getC = getC,
    getF = getF,
    getK = getK
  }
end
2019-07-29 15:10:53