【发布时间】:2016-08-08 03:28:29
【问题描述】:
我正在尝试使用标准 < 运算符在 Lua 中进行逐个元素比较的方法。例如,这是我想做的:
a = {5, 7, 10}
b = {6, 4, 15}
c = a < b -- should return {true, false, true}
我已经有代码用于加法(以及减法、乘法等)。我的问题是 Lua 强制将比较结果与布尔值进行比较。我不想要一个布尔值,我想要一个表格作为比较的结果。
到目前为止,这是我的代码,加法有效,但小于比较无效:
m = {}
m['__add'] = function (a, b)
-- Add two tables together
-- Works fine
c = {}
for i = 1, #a do
c[i] = a[i] + b[i]
end
return c
end
m['__lt'] = function (a, b)
-- Should do a less-than operator on each element
-- Doesn't work, Lua forces result to boolean
c = {}
for i = 1, #a do
c[i] = a[i] < b[i]
end
return c
end
a = {5, 7, 10}
b = {6, 4, 15}
setmetatable(a, m)
c = a + b -- Expecting {11, 11, 25}
print(c[1], c[2], c[3]) -- Works great!
c = a < b -- Expecting {true, false, true}
print(c[1], c[2], c[3]) -- Error, lua makes c into boolean
Lua 编程手册说__lt 元方法调用的结果总是被转换为布尔值。我的问题是,我该如何解决这个问题?我听说 Lua 对 DSL 很好,我真的需要语法才能在这里工作。我认为使用 MetaLua 应该是可能的,但我不确定从哪里开始。
一位同事建议我只使用<< 而不是__shl 元方法。我尝试了它并且它有效,但我真的想使用< 来减少,而不是使用错误的符号进行破解。
谢谢!
【问题讨论】:
-
为什么需要它作为运营商?你不能只使用普通功能吗?
-
@Piglet 我正在制作 DSL。我希望能够做类似
a*(b+5)/c<d之类的事情,其中a、b、c和d都是向量(数组)。将其重写为前缀函数调用非常冗长:less_than(divide(multiply(a, add(b, 5),c),d)。我不能要求我的用户写那个。