我对 Lua 完全陌生,无法理解这一点:以下函数总是返回 99,即使 angleNumber 是 2,3,4 等。
我是否忽略了一些 Lua 语法怪癖?
local function mirroredNumber (angleNumber)
if angleNumber == 2 then
return 8
elseif angleNumber == 3 then
return 7
elseif angleNumber == 4 then
return 6
elseif angleNumber == 6 then
return 4
elseif angleNumber == 7 then
return 3
elseif angleNumber == 8 then
return 2
else
return 99
end
end
我尝试在 if 语句中设置一个局部变量并最终返回该变量,但这也不起作用,所以我认为我的 if/elseif 检查是错误的,但我无法弄清楚如何。
有两个相关的 Lua 怪癖,我怀疑其中之一在这里起作用:
让我们首先简化您的示例:
如此,并且对于每个不等于的情况也是
f(1)
如此。0
f(x)
1
x
1
像数字一样嘎嘎作响的字符串
Lua 有一个有争议的“功能”,如果你对字符串进行算术运算,它会将字符串强制转换为数字,如果你对它们进行算术运算,则会将数字强制转换为字符串;
print
只是内部调用tostring
,不引用字符串,因此字符串非常“像数字一样嘎嘎”。然而,相等性(或表索引)测试是“严格的”;它还需要类型匹配。看这个例子:这里的解决方案,假设
x
是一个来自文件或类似文件的字符串,是tonumber(x)
(或等效的:x + 0
,其行为大致类似于assert(tonumber(x))
)。舍入误差
Lua 使用浮点数来表示数字。浮点数可以准确地表示高达 2^53 的整数(不会损失精度),因此在处理整数时,这通常不是问题。但是,您可以构造非常接近整数的浮点数,但实际上不是整数。不幸的是,Lua在打印数字时会对数字进行四舍五入,因此如果插入调试打印,您将看不到这一点。考虑:
要发现这一点,请打印
x
到 17 位精度:如果您知道自己的工作存在不准确之处,则应该与一些“错误空间”进行比较。
x == 1
因此,您无需测试 ,而是测试math.abs(x - 1) < 1e-6
,1e-6
在此示例中,您的(绝对)误差范围在哪里。(注意:相对误差范围有时可能更合适;浮动尤其可以保证一定的相对误差)。旁注:在许多具有
switch
es、模式匹配或类似功能的语言中,函数和switch
+return
可能是实现此功能的惯用方式。然而,考虑到这只是从一些数字到其他数字的映射,你通常会在 Lua 中使用一个表:x
(另外,“镜像”数字和( )之间似乎存在简单的对应关系if angleNumber >= 2 and angleNumber <= 8 then return 10 - angleNumber end
,除非您只是在本示例中简化了它;为什么不利用它呢?)