我有一个包含数字的变量。虽然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
这有效,但却失去了有功能的目的。
该功能有什么问题?我确信有一个完全合理和合理的解释 - 除了熟悉编程语言的人。
答案 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概念。