hello world

1
print("hello world!")

推荐菜鸟教程或者W3Cschool

https://www.w3cschool.cn/lua/lua-basic-syntax.html

基本语法

交互式编程

1
2
3
> print("Hello World!")
Hello World!
>

脚本式编程

1
2
3
#!/usr/local/bin/lua

print("Hello World!")

注释

单行注释

两个减号是单行注释:

1
--

多行注释

1
2
3
4
--[[
多行注释
多行注释
--]]

标识符

Lua 标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。

最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。

Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言。因此在 Lua 中 W3c 与 w3c 是两个不同的标示符。以下列出了一些正确的标示符:

1
2
mohd         zara      abc     move_name    a_123
myname50 _temp j a23b9 retVal

关键词

以下列出了 Lua 的保留关键字。保留关键字不能作为常量或变量或其他用户自定义标示符:

and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while

一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。

全局变量

在默认情况下,变量总是认为是全局的。

全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。

1
2
3
4
5
> print(b)
nil
> b=10
> print(b)
10

如果你想删除一个全局变量,只需要将变量赋值为nil。

1
2
b = nil
print(b) --> nil

这样变量b就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-- #!/usr/local/bin/lua开头,指定lua的解释器
-- 加上 # 号标记解释器会忽略它



-- 两个中线时单行注释
-- 分号,加不加都可以。类似js
-- print控制天输出
print("hello world");


-- lua hello.lua 控制台运行lua文件

--[[
多行注释
多行注释
--]]

-- 错误命名标识符
-- local a@ = 1
-- local then = 1

-- 正确命名标识符
local a_123 = 1

print(b)
-- 输出为nil

数据类型

Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。

数据类型 描述
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean 包含两个值:false和true。
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by Think.
--- DateTime: 2021/9/2 10:21
---

print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(X)) --> nil
print(type(type(X))) --> string


--[[
控制台打印:

lua.exe 数据类型.lua
string
number
function
function
boolean
nil
nil
string

--]]

nil

nil 类型表示一种没有任何有效值,它只有一个值 – nil,例如打印一个没有赋值的变量,便会输出一个 nil 值:

1
2
3
> print(type(a))
nil
>

对于全局变量和 table,nil 还有一个”删除”作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end

tab1.key1 = nil
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end

--[[
控制台打印:

1 - val3
key1 - val1 第一次有这个值,置空后没有这个值了
key2 - val2
1 - val3
key2 - val2

--]]

使用 nil 作比较时应该加上双引号:

1
2
3
4
5
6
7
> type(X)
nil
> type(X)==nil
false
> type(X)=="nil"
true
>

boolean

boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是”假”,其他的都为”真”(0也是真):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
print(type(true))
print(type(false))
print(type(nil))
print(type(0))
if false or nil then
print("至少有一个是 true")
else
print("false 和 nil 都为 false")
end

if 0 then
print("数字 0 是 true")
else
print("数字 0 为 false")
end

--[[
控制台打印:
lua.exe 数据类型.lua
boolean
boolean
nil
number
false 和 nil 都为 false
数字 0 是 true
--]]

number

Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))

--[[
number
number
number
number
number
number
--]]

字符串

  • 字符串由一对双引号或单引号来表示。

  • 也可以用 2 个方括号 “[[]]” 来表示”一块”字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
string1 = "this is string1"
string2 = 'this is string2'
html = [[
<html>
<head></head>
<body>
<a href="//www.lvxiaoyi.top/">吕小医&博客</a>
</body>
</html>
]]

print(type(string1))
print(type(string2))
print(type(html))
print(html)

--[[
string
string
string
<html>
<head></head>
<body>
<a href="//www.lvxiaoyi.top/">吕小医&博客</a>
</body>
</html>
--]]
  • 在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:

    1
    2
    3
    4
    5
    6
    7
    print("2" + 6)
    print("2" + "6").

    --[[
    8
    8
    --]]
  • 字符串连接使用的是 .. ,而不是用的+

1
2
3
4
5
6
7
8
9
10
11
12
13
14
print("lvxiaoyi" + ".top")

--[[
lua.exe: ��������.lua:1: attempt to perform arithmetic on a string value
stack traceback:
��������.lua:1: in main chunk
[C]: ?
--]]

print("lvxiaoyi" .. ".top")

--[[
lvxiaoyi.top
--]]

table(表)

在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 创建一个空的 table
local tbl1 = {}

-- 直接初始表
local tbl2 = {"lvxiaoyi.top", "pear", "orange", "grape"}
print(type(tbl1))
print(tbl1)
print(tbl2)

for key, val in pairs(tbl2) do
print( key,val)
end

--[[
table
table: 00CC99A0
table: 00CC99C8
1 lvxiaoyi.top
2 pear
3 orange
4 grape
--]]

Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
a = {}
a["key"] = 22
key = "blog"
a[key] = "lvxioayi"
a[key] = a[key] .. ".top"
for k, v in pairs(a) do
print(k .. " : " .. v)
end

--[[
key : 22
blog : lvxioayi.top
--]]

不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。

1
2
3
4
5
6
7
8
9
10
11
local tbl2 = {"lvxiaoyi.top", "blog", "study", "lvxiaoyi"}
for key, val in pairs(tbl2) do
print("Key", key)
end

--[[
Key 1
Key 2
Key 3
Key 4
--]]

table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。