1. lua 运算符
lua支持的运算符有 + - * / % ^(加、减/负、乘、除、取余、幂指) 尤其要说的是幂指运算,这是大多数语言都不支持的,幂指运算不仅仅可以正指数,还可以负指数,贼牛逼
print(2^10, 3^10, 4^0.5, -3^18, 4^-3, 6^-0.3)
>>>
1024.0 59049.0 2.0 -387420489.0 0.015625 0.58419068106787
除了幂运算外,取余运算也是我们需要注意的,在Lua中(其实大部分语言都这样处理),取余运算被等价于
a % b == a - math.floor(a/b)*b
这里需要注意小数点精度 的问题,可能有问题,也可能没有
==
>=
<=
~=
>
<
特别要注意的 lua运算符只能比较同数据类型的变量 数据类型不一样的变量之间比较 一律返回false
local a= 10
local b = "10"
print(a == b)
print(a == b + 0)
>>>
false
true
在上面代码中很容易看出来 作为数字的 a 和 作为字符串的 b ,进行比较时,即使二者的数值相等,返回的也是false值。但是将 b 转换为数值类型再比较就可以判断出二者等值 返回true
此处特别要注意的是对象 类型的比较 只有对象二者是同一个对象时才会判断二者相等,否则二者不相等 原因是对象类型的等值判断 是 判断二者的引用?(原文说的是“reference ”),lua每次创建新的对象都和之前的对象不一样,即使内容一样,创建出的两个对象也是不同的。 深究原因 应该是设置内存指针相关,具体原因日后细想吧 而且貌似比较运算符还有原方法(元操作符)
2.区块运算的方法
在C++之类的语言中 想在某一范围内只做一件事 并且做完把这块内存释放掉可以使用{}来包裹代码块,来提高安全性 同样的lua中也提供这种操作 那便是do end 操作
do
local a = 10
print(a)
end
print(a)
>>>
10
nil
也可以通过实验很轻松的看出来 变量a的内存在end后就被释放掉 这样可以很好的解决作用域问题
了解了上述的问题 我们可以更直观的知道lua是怎样构造对象的(结构体?)
local a = {10 == 10, "10" == 10}
print(a.temp)
for _, i in pairs(a) do
print(i)
end
local value
do
local t = {}
t[1] = 1
t[2] = 2
t.temp = "dfsgf"
value = t
end
for _, i in pairs(value) do
print(i)
end
>>>
nil
true
false
1
2
dfsgf
lua对于userdata的构建相当于上述代码 在一块区域构建好userdata相关的内存后,用指针指向这块内存