Lua:如何将变量设置为零

时间:2010-12-28 15:25:11

标签: lua casting

我有一个包含数字的变量。虽然Lua允许将变量设置为nil,但变量会变得有毒 - 破坏其路径中的所有代码。

如果变量包含nil,我希望它转换为零。

local score;
score = gameResults.finalScore;

我想确保score包含一个数字,所以我尝试:

local score;
score = tonumber(gameResults.finalScore);

但这不起作用。所以我试试:

local function ToNumberEx(v)
   if (v == nil) then
      return 0
   else
      return tonumber(v)
end

local score;
score = ToNumberEx(gameResults.finalScore);

但这不起作用。所以我试试:

local function ToNumberEx(v)
   if (v == nil) then
      return 0
   else
      return tonumber(v)
end

local score;
score = ToNumberEx(gameResults.finalScore);

if (score == nil) then
   score = 0
end

这有效,但却失去了有功能的目的。

该功能有什么问题?我确信有一个完全合理和合理的解释 - 除了熟悉编程语言的人。

3 个答案:

答案 0 :(得分:15)

score = tonumber(gameResults.finalScore) or 0

答案 1 :(得分:3)

  

如果参数已经是数字或   一个可转换为数字的字符串   tonumber返回此数字;   否则,它返回nil。

您的代码很好,除非您没有考虑当gameResult.finalScore无法转换为数字时发生的情况,如果它是“”或“stuff”或者表格而不是tonumber将返回nil。你的检查都没有发现这种情况。

答案 2 :(得分:1)

如果你真的想要强制执行这个变量gameResults.finalScore有这种行为(当接收到与数字不同的任何值时设置为零),那么你应该看看Lua metatables

您可以为gameResults创建元表,并“覆盖”元表的"index""newindex"方法,检查finalScore字段的值,从而强制它的价值在所需的范围内。

不是最好的解决方案,但根据你的情况,对团队中的其他“邪恶的开发者”可能是一个很好的防御措施。 : - )

www.lua.org/pil/13.html(我目前不允许发布超过1个链接)PiL 1也可以提供帮助,如果您仍在使用Lua 5.0或者您希望更深入地了解metatables概念。