Lua速成(1)

一、基本语法

1.交互式编程

在命令行中输入程序并立即查看效果

Lua 复制代码
print("Hello World");

按下回车键直接出结果!

2.脚本式编程

将程序代码保存在lua文件里并执行,可以在开头指定解释器

Lua 复制代码
#!/usr/local/bin/lua
print("Hello World");

3.注释

1.单行注释

Lua 复制代码
--

2.多行注释

Lua 复制代码
--[[
多行注释
啊啊啊
]]--

4.标示符

Lua标示符用于定义一个变量,函数获取其他用户定义的项。

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

不允许用特殊字符,区分大小写

5.关键词

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

6.全局变量

默认情况下,变量总是认为是全局的,全局变量不需要声明,给一个变量赋值即为创建,访问一个没有初始化的全局变量也不会出错,只不过它会是nil

Lua 复制代码
> print(b)
nil
>b=10
>print(b)
10
>

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

Lua 复制代码
b=nil
print(b)    -->nil

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

二、数据类型

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

8个基本类型:nil boolean number string userdata function thread table

nil 表示一个无效值

boolean 包含false true

number 表示双精度类型的实浮点数

string 字符串 双引号或单引号来表示

function 由C或Lua编写的函数

userdata 表示任意存储在变量中的C数据结构

thread 表示执行的独立线路,用于执行协同程序

table Lua中的table其实是一个关联数组,数组的索引可以是数字、字符串或表类型。在Lua中,table的创建时通过构造表达式来完成,最简单的构造表达式是{},用来创建一个空表。

Lua 复制代码
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(type(X)))            --> string

1.nil(空)

表示一种没有任何有效值,例如一个没有赋值的变量

Lua 复制代码
> print(type(a))
nil
>

对于全局变量和table,nil还有删除作用,赋值nil等于删了

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

Lua 复制代码
> type(X)
nil
> type(X)==nil
false
> type(X)=="nil"
true
>

type(X)==nil结果为false原因是type(X)实质是返回的"nil"字符串,是string类型

Lua 复制代码
type(type(X))==string

2.boolen(布尔)

只有true和false,nil是false,其他都为true,0也是true

Lua 复制代码
print(type(true))
print(type(false))
print(type(nil))
 
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 复制代码
$ lua test.lua 
boolean
boolean
nil
false 和 nil 都为 false
数字 0 是 true

3.number(数字)

就是double啦,下面这些全都被看作number

Lua 复制代码
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))

4.string(字符串)

字符串由一对双引号或单引号来表示,也可以用[[]]来表示一块字符串

Lua 复制代码
html = [[
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]
print(html)
Lua 复制代码
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>

在对一个数字字符串上进行算术操作时,Lua会尝试将这个数字字符串转成一个数字

Lua 复制代码
> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)

而字符串连接使用的是..

Lua 复制代码
> print("a" .. 'b')
ab
> print(157 .. 428)
157428
> 

#放在前边用于计算字符串的长度

Lua 复制代码
> len = "www.runoob.com"
> print(#len)
14
> print(#"www.runoob.com")
14
>

5.table(表)

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

Lua 复制代码
-- 创建一个空的 table
local tbl1 = {}
 
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

table其实是一个关联数组,数组的索引可以是数字或者字符串

Lua 复制代码
-- table_test.lua 脚本文件
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end
Lua 复制代码
$ lua table_test.lua 
key : value
10 : 33

插入一点迭代器的事,防止看不懂哈

Lua 复制代码
for key,value in ipairs(array)
do
   print(key, value)
end

table初始索引一般从1开始

Lua 复制代码
-- table_test2.lua 脚本文件
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end
Lua 复制代码
$ lua table_test2.lua 
Key    1
Key    2
Key    3
Key    4

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

Lua 复制代码
-- table_test3.lua 脚本文件
a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])
Lua 复制代码
$ lua table_test3.lua 
val
nil

6.function(函数)

Lua中,函数可以存在变量里,函数可以一整个赋值

Lua 复制代码
-- function_test.lua 脚本文件
function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))
Lua 复制代码
$ lua function_test.lua 
120
120

function可以以匿名函数的方式通过参数传递,大概就是函数可以作为参数(?

Lua 复制代码
-- function_test2.lua 脚本文件
function testFun(tab,fun)
        for k ,v in pairs(tab) do
                print(fun(k,v));
        end
end


tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函数
        return key.."="..val;
end
);
Lua 复制代码
$ lua function_test2.lua 
key1=val1
key2=val2

7.thread(线程)

在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

8.userdata(自定义类型)

userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。

三、变量

变量在使用前,需要在代码中进行声明,即创建该变量。

编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。

Lua 变量有三种类型:全局变量、局部变量、表中的域。

Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束。

变量的默认值均为 nil。

Lua 复制代码
-- test.lua 文件脚本
a = 5               -- 全局变量
local b = 5         -- 局部变量

function joke()
    c = 5           -- 全局变量
    local d = 6     -- 局部变量
end

joke()
print(c,d)          --> 5 nil

do 
    local a = 6     -- 局部变量
    b = 6           -- 对局部变量重新赋值
    print(a,b);     --> 6 6
end

print(a,b)      --> 5 6

1.赋值

可以对多个变量同时赋值

Lua 复制代码
a, b = 10, 2*x       <-->       a=10; b=2*x

遇到赋值语句会先计算右边所有的值然后再进行赋值操作,所以可以直接交换变量

Lua 复制代码
x, y = y, x                     -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i]         -- swap 'a[i]' for 'a[j]'

当变量个数和值的个数不一致时,会采取以下策略

Lua 复制代码
a. 变量个数 > 值的个数             按变量个数补足nil
b. 变量个数 < 值的个数             多余的值会被忽略
Lua 复制代码
a, b, c = 0, 1
print(a,b,c)             --> 0   1   nil
 
a, b = a+1, b+1, b+2     -- value of b+2 is ignored
print(a,b)               --> 1   2
 
a, b, c = 0
print(a,b,c)             --> 0   nil   nil

上面最后一个例子是一个常见的错误情况,注意:如果要对多个变量赋值必须依次对每个变量赋值。

Lua 复制代码
a, b, c = 0, 0, 0
print(a,b,c)             --> 0   0   0

多值赋值经常用来交换变量,或将函数调用返回给变量:

Lua 复制代码
a, b = f()

f()返回两个值,第一个赋给a,第二个赋给b。

应该尽可能的使用局部变量,有两个好处:

    1. 避免命名冲突。
    1. 访问局部变量的速度比全局变量更快。

2.索引

对 table 的索引使用方括号 []。Lua 也提供了 . 操作。

Lua 复制代码
t[i]
t.i                 -- 当索引为字符串类型时的一种简化写法
gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
Lua 复制代码
> site = {}
> site["key"] = "www.runoob.com"
> print(site["key"])
www.runoob.com
> print(site.key)
www.runoob.com

四、循环

1.循环处理方式

while 条件为true时重复执行

for 重复次数可在for中控制

repeat...until 重复 直到条件为真

循环嵌套 可以在循环内嵌套一个或多个循环语句(while do ... end;for ... do ... end;repeat ... until;)

2.循环控制语句

break 退出当前循环或语句,执行下边的

goto 将程序的控制点转移到下一个标签处

相关推荐
hopetomorrow5 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
小牛itbull15 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i23 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落26 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜35 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198740 分钟前
STL关联式容器之set
开发语言·c++
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis
Mr.131 小时前
什么是 C++ 中的初始化列表?它的作用是什么?初始化列表和在构造函数体内赋值有什么区别?
开发语言·c++
陌小呆^O^1 小时前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp