为什么Lua的`特性如此受欢迎?
- 内容介绍
- 文章标签
- 相关推荐
本文共计612个文字,预计阅读时间需要3分钟。
Lua中,除了==和~=之外,还有+=操作符和元方法(如OP_LE, TM_LE)。文档提到,在没有le元方法的情况下,Lua会尝试lt,假设a=b等价于not (b + a)。但为什么先有+=而不是-呢?
这是因为Lua的设计考虑了运算符的优先级和逻辑。在比较操作中,+=意味着将值加到变量上,这通常与增加或累加有关,而-则与减少或减去有关。Lua的设计者可能认为,在比较操作中,增加操作比减少操作更符合直觉。
此外,+=操作符在Lua中也有其特定的用途,比如在循环中累加变量值。因此,在比较操作中优先使用+=可以保持代码的一致性和可读性。
至于为什么+=不能总是等同于not (b + a),这是因为+=操作涉及到变量值的改变,而比较操作通常不涉及变量值的改变。因此,两者在逻辑上并不完全等价。
除了==和<之外,Lua还有< =操作码和元方法(OP_LE,TM_LE). 文档说in the absence of a “le” metamethod, Lua tries the “lt”, assuming that a <= b is equivalent to not (b < a)
但为什么首先有’< ='?为什么它不能总是不使用(b 和> =操作码和元方法?
让我们实现 sets.使用订单运算符进行包含测试真的很简洁. a< b意味着“a是b的适当子集”. a = b将mena“a和b相等”. a< = b意味着“a是b的子集”(不一定是合适的,因此它们可能相等). 现在考虑a = Set:new{1, 2, 3} b = Set:new{"a", "b", "c"}
现在既不是< = b也不是< b是真的.这是为什么?因为子集关系仅定义了partial order.a< = b等效于(a> b)的逻辑假设仅对定义total order的完全关系有效.
(示例受“Lua编程,第3版”第131页启发)
编辑:
解决您的更新.为什么没有Lua metamethods~ =,>和> =关于DSL实现?
即使在部分有序的集合上,以下也始终如此:
a > b <==> b < a a >= b <==> b <= a a ~= b <==> not (b == a)
为<定义不同的含义和> (切换顺序除外)会让你的代码真的很混乱,你不觉得吗?同样的事情,如果两个a和b可以是相等的和不相等的(或两者都不是).我想,这就是为什么Lua做出这样的假设,它总是可以用其他运算符来实现这三个运算符.
本文共计612个文字,预计阅读时间需要3分钟。
Lua中,除了==和~=之外,还有+=操作符和元方法(如OP_LE, TM_LE)。文档提到,在没有le元方法的情况下,Lua会尝试lt,假设a=b等价于not (b + a)。但为什么先有+=而不是-呢?
这是因为Lua的设计考虑了运算符的优先级和逻辑。在比较操作中,+=意味着将值加到变量上,这通常与增加或累加有关,而-则与减少或减去有关。Lua的设计者可能认为,在比较操作中,增加操作比减少操作更符合直觉。
此外,+=操作符在Lua中也有其特定的用途,比如在循环中累加变量值。因此,在比较操作中优先使用+=可以保持代码的一致性和可读性。
至于为什么+=不能总是等同于not (b + a),这是因为+=操作涉及到变量值的改变,而比较操作通常不涉及变量值的改变。因此,两者在逻辑上并不完全等价。
除了==和<之外,Lua还有< =操作码和元方法(OP_LE,TM_LE). 文档说in the absence of a “le” metamethod, Lua tries the “lt”, assuming that a <= b is equivalent to not (b < a)
但为什么首先有’< ='?为什么它不能总是不使用(b 和> =操作码和元方法?
让我们实现 sets.使用订单运算符进行包含测试真的很简洁. a< b意味着“a是b的适当子集”. a = b将mena“a和b相等”. a< = b意味着“a是b的子集”(不一定是合适的,因此它们可能相等). 现在考虑a = Set:new{1, 2, 3} b = Set:new{"a", "b", "c"}
现在既不是< = b也不是< b是真的.这是为什么?因为子集关系仅定义了partial order.a< = b等效于(a> b)的逻辑假设仅对定义total order的完全关系有效.
(示例受“Lua编程,第3版”第131页启发)
编辑:
解决您的更新.为什么没有Lua metamethods~ =,>和> =关于DSL实现?
即使在部分有序的集合上,以下也始终如此:
a > b <==> b < a a >= b <==> b <= a a ~= b <==> not (b == a)
为<定义不同的含义和> (切换顺序除外)会让你的代码真的很混乱,你不觉得吗?同样的事情,如果两个a和b可以是相等的和不相等的(或两者都不是).我想,这就是为什么Lua做出这样的假设,它总是可以用其他运算符来实现这三个运算符.

