Data Type
Lua 的数据类型:
- nil
- boolean
- number
- string
- userdata
- function
- table
任何类型的 value 都可以做 conditional test;但只有 nil
和 false
被认为 falsy value。
> 4 and 5 --> 5
> nil and 13 --> nil
> false and 13 --> false
> 0 or 5 --> 0 (0 不是 falsy value)
> false or "hi" --> "hi"
> nil or false --> false
dofile
dofile("a.lua")
会把 a.lua
的代码执行一次。
Lexical
Identifier:这种 _VERSION
是合法的标识符,但是用户的代码不要用它,这通常被 Lua 用作特殊用途。比如 _VERSION
保存的是 Lua 的版本,如 “Lua 5.4”。
Comment:
-- Short comment
a = 10 -- a is a variable
-- Long comment
-- --[[ ]] 中间的部分是长评论。
--[[This is a long comment.
Can be multiple lines.
]]
-- 你可以用这种 pattern 来注释一片代码:
--[[
a = 1
b = 2
--]]
-- 一旦需要反注释掉这片代码,在第一行加多个 hypen 即可:
---[[
a = 1
b = 2
--]]
No separator between statements:
-- 这些都是合法的
a = 1
b = a * 2
a = 1;
b = a * 2;
a = 1; b = a * 2
a = 1 b = a * 2 -- ugly, but valid
Variable
> b --> nil
> b = 10
> b --> 10
-- 对于 Lua 来说,给一个变量赋值 nil,语义上等同于将该变量从当前 scope 中删除。
> b = nil
> b --> nil
Lua CLI
# 执行一个 Lua 脚本文件
$ lua a.lua
# -e: 命令行参数作为 Lua 代码执行
$ lua -e "print(math.sin(12))"
-0.53657291800043
# -i: 执行完后进入 interactive shell
$ lua -e "print(math.sin(12))" -i
$ lua a.lua -i
Lua 的 arg
很奇怪。对于这样一个 hello.lua
:
print(arg[-3])
print(arg[-2])
print(arg[-1])
print(arg[0])
print(arg[1])
print(arg[2])
print(arg[3])
$ lua -e "a = 1" hello.lua 1 2 3 4
nil
nil
lua
-e
a = 1
hello.lua
1
2
3
逻辑是:脚本名 hello.lua
是 arg[0]
,其他顺排。
Relational Operators
关系操作符有:<
>
<=
>=
==
~=
。最后一个即是其他语言中的 !=
。
如果两个值的类型不一样,它们必然不相等:
> 1 < "1"
stdin:1: attempt to compare number with string
stack traceback:
stdin:1: in main chunk
[C]: in ?
> 1 == "1"
false
类型转换
Lua 不提倡隐式类型转换。但是(仅)在算术操作上,会有隐式转换:
> 10 .. "a"
10a
> "10" + 1
11.0
算术操作(除了 /
除法)中,仅当两个操作数都为整数时,结果为整数。因此 "10" + 1
的结果为 11.0
。
string => number:
> tonumber(" -3 ") --> -3
> tonumber("100101", 2) --> 37
> tonumber("fff", 16) --> 4095
> tonumber("-ZZ", 36) --> -1295 (最高支持 36 进制)
> tonumber("987", 8) --> nil (在 8 进制下,不是一个合法数字)
number => string:tostring(10)
。
List index
Lua 的索引是 1-based,与惯常的 0-based 不一样。