Lua: Language: Basic

 26th February 2022 at 5:34pm

Data Type

Lua 的数据类型:

  • nil
  • boolean
  • number
  • string
  • userdata
  • function
  • table

任何类型的 value 都可以做 conditional test;但只有 nilfalse 被认为 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.luaarg[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 不一样。