【问题标题】:Lua throwaway resultLua 一次性结果
【发布时间】:2012-12-14 23:23:52
【问题描述】:

我有一种情况,我对表执行一些操作,将它们称为 T 和 V。我已经正确设置了元表,并且一切都按预期工作。问题是我通常不需要计算的结果。所以不要写

for i=1,5 do
    _=T+V
end

有没有办法让自己拥有

for i=1,5 do
    T+V
end

?

我没有使用 Lua 命令行,所以我不能只写 =T+V。

【问题讨论】:

  • 你为什么要在不需要结果的地方进行计算?
  • @DeadMG 你没有理由不能说,重载表上的 + 运算符以使用第二个表中的数据修改传入的第一个表,尽管这看起来不太直观。跨度>
  • 真正适合 Lua 风格的成员函数,而不是运算符重载。
  • 是的,但能力是存在的。
  • @John: 1: 问题已得到解答。您可以通过语言手册确认答案; see the stat ::= clause 显示该语言的法律声明是什么。 2: 道德与它无关;滥用运算符重载来违背程序员的期望(比如定义+ 来做减法,或者修改它的操作数),它只是糟糕的编程(除非你的目标是在Daily WTF 上出现。

标签: lua


【解决方案1】:

创建一个什么都不做的函数并将其传递给它:

function NOP() end

for i=1,5 do
    NOP(T+V)
end

这还可以记录您的意图,而副作用就是您所追求的。

【讨论】:

  • 非常漂亮,如此简单我不敢相信我没有想到它!
  • @MikeCorcoran 我想到了,但是无缘无故添加函数调用的开销似乎很浪费(_=0 的速度大约是NOP(0) 的两倍)。实际上,我们谈论的是几分之一微秒的开销,因此使用最佳读取值是有意义的。
【解决方案2】:

看着syntax of Lua in extended BNF,我看不到没有等号或其他东西的构造表达式(exp)的方法。

只有4种情况可以使用表达式(exp):

  • 分配一个值,例如p = exp

  • 作为条件,例如while exp then

  • 在函数调用中,即f(exp)

  • 用于索引,即t[exp]

【讨论】:

  • 索引仍需要分配
  • @daurnimator 不一定,例如f(t[exp]) 或者如果 t[exp] 那么。
  • 当然。但我的意思是它需要这个列表中的其他东西才能工作。
猜你喜欢
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2012-01-26
  • 2017-10-17
相关资源
最近更新 更多