Lua语言快速入门一

安装请看我的另一篇博客:https://blog.csdn.net/qq_42094345/article/details/107816577

hello world

print:打印函数
新建一个文件helloWorld.lua(lua源代码以lua为后缀),并写入内容

print("Hello World !")

保存并进入源文件目录下使用 lua 命令执行:

 lua .\helloWorld.lua

结果:
结果

基本语法

  1. lua交互页面
    交互页面:来自百度百科的介绍在这里插入图片描述

使用命令lua 或者 lua -i 进入交互页面
在这里插入图片描述

  1. lua保留字(重要)
    保留关键字不能作为常量或变量或其他用户自定义标示符
    在这里插入图片描述一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。

  2. 标识符
    Lua 标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。
    最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。
    Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。
    Lua 是一个区分大小写的编程语言,因此在 Lua 中 Runoob 与 runoob 是两个不同的标示符。
    以下列出了一些正确的标示符:

mohd         zara      abc     move_name    a_123
myname50     _temp     j       a23b9        retVal
  1. 变量
    在默认情况下,变量总是认为是全局的。
    全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。

在这里插入图片描述如果你想删除一个全局变量,只需要将变量赋值为nil。
在这里插入图片描述这样变量a就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。

局部变量(local variable)
只在被声明的哪个代码块内有效
代码块:控制结构、函数、chunk(变量被声明的那个文件或者文本串)
定义方法:使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。定义局部变量可以为它设置一个初始值,也可以不用

local a = 123
local b

全局变量(global variable)
全局变量Lua变量默认是全局的,在整个会话中将保持不变,除非改变了它。在使用全局变量时,在变量前加个g字母会更加明确。不过,尽量使用局部变量。
定义方法:在Lua中定义全局变量非常简单,就是定义变量的时候,前面不要加上local

c = 123

注意:全局变量必须有初始值!

Lua 数据类型及使用

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
在这里插入图片描述
我们可以使用 type 函数测试给定变量或者值的类型

print(type(a))
结果:nil
a = 1
print(type(a))
结果:number
  1. nil(空)
    nil 类型表示一种没有任何有效值,它只有一个值 – nil,例如打印一个没有赋值的变量,便会输出一个 nil 值
    交互页面:
> print(a)
nil

对于全局变量和 table,nil 还有一个"删除"作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉:
新建lua文件 test.lua
然后写入以下代码:

t = { k1 = "val1", k2 = "val2", k3 = "val3" }
print("-------------------------第一次打印-------------------------------")
-- 遍历这个table 并打印
for k, v in pairs(t) do
    print(k .. " - " .. v)
end

print("-------------------------第二次打印-------------------------------")
-- 将变量t删除
t.k1 = nil
-- 重新遍历并打印
for k, v in pairs(t) do
    print(k .. " - " .. v)
end

使用lua命令执行脚本 lua .\test.lua

结果:

PS E:\Domes\lua\test1> lua .\test.lua    
-------------------------第一次打印-------------------------------
k1 - val1
k3 - val3
k2 - val2
-------------------------第二次打印-------------------------------
k3 - val3
k2 - val2
PS E:\Domes\lua\test1>                                                                                                                                                                                                                                                            

清楚的发现 k1已经被我们删除
注意: 这里打印中文可能会出现乱码问题,解决方法有两种,1:让你的系统平台编码改为utf-8
或者 文件格式改为 GBK。具体自行百度吧,很简单。如果你linux、mac应该不会出现类似问题。

  1. boolean(布尔)
    boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true:
> print(type(true))
boolean
>print(type(false))
boolean
> print(type(nil))
nil
> 
> -- 判断两个变量是否相等
> a = 1
> b = 2
> c = 1
> print(a == b)
false
> print(a == c)
true
>                 

布尔主要用于分支的判断:


a = 1
b = 2
c = 1

if a == b then
    print("a等于b")  
else
    print("a不等于b")   
end

if a == c then
    print("a等于c")  
else
    print("a不等于c")   
end

结果:

PS E:\Domes\lua\test1> lua .\test.lua 
a不等于b
a等于c
PS E:\Domes\lua\test1>                                                                                                                                                                                                                                                           
  1. number(数字)
    Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义),以下几种写法都被看作是 number 类型:
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))

结果:

PS E:\Domes\lua\test1> lua .\test2.lua
number
number
number
number
number
number
PS E:\Domes\lua\test1>                                                                                                                              
  1. string(字符串)
    字符串由一对双引号或单引号来表示。
a = "abc"
b = 'edf'

print(a)
print(b)

结果:

PS E:\Domes\lua\test1> lua .\test3.lua
abc
edf
PS E:\Domes\lua\test1>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

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

html = [[
<html>
<head></head>
<body>
    <a href="http://www.baidu.com/">baidu</a>
</body>
</html>
]]
print(html)

结果:

<html>
<head></head>
<body>
    <a href="http://www.baidu.com/">baidu</a>
</body>
</html>

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

PS E:\Domes\lua\test1> lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print("2"+1)
3
> print("2"+"2")
4
> print("2"*"3")
6
> print("2"*5)
10
>    

但是

PS E:\Domes\lua\test1> lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print("a"+1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: ?
> 

如果字符串中不是数字但是却与数字相加是不允许的,所以会报错。

我们可以使用..对他们进行字符串拼接:

PS E:\Domes\lua\test1> lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print("a".."b")
ab
> print("abc".."def")
abcdef
> print(123 .. 456)
123456
>    

注意: 数字拼接时注意加空格!

使用 # 来计算字符串的长度,放在字符串前面,如下实例:

PS E:\Domes\lua\test1> lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> print(#"abc")
3
>  

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

-- 创建一个空的 table
local t1 = {}
 
-- 直接初始表
local t2a = {"apple", "pear", "orange", "grape"}

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

a = {}
a["k1"] = "abc"
kk = "k2"
a[kk] = 22
a[kk] = a[kk] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

结果

PS E:\Domes\lua\test1> lua .\test4.lua
k1 : abc
k2 : 33
PS E:\Domes\lua\test1>      

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

local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

结果:

S E:\Domes\lua\test1> lua .\test4.lua
Key     1
Key     2
Key     3
Key     4
PS E:\Domes\lua\test1>

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

a = {}
for i = 1, 10 do
    a[i] = i
end
a["k1"] = "123"
print(a["k1"])
print(a["none"])

结果:

PS E:\Domes\lua\test1> lua .\test4.lua
123
nil
PS E:\Domes\lua\test1>  
  1. function(函数)
    在 Lua 中,函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里
function test( a )
    return "参数为:"..a
end

print(test(1111))

myfun = test

print(myfun(2222))

结果:

PS E:\Domes\lua\test1> lua .\test4.lua
参数为:1111
参数为:2222
PS E:\Domes\lua\test1>

function 可以以匿名函数(anonymous function)的方式通过参数传递

function testFun(tab,fun)
    for k ,v in pairs(tab) do
            print(fun(k,v));
    end
end


t={k1="a",k2="b"};
testFun(t, function(key,val) --匿名函数
                return key.."="..val;
           end
);

结果:

PS E:\Domes\lua\test1> lua .\test4.lua
k1=a
k2=b
PS E:\Domes\lua\test1>    
  1. thread(线程)
    在 Lua 里,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。
    线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

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

  3. Lua 变量
    变量在使用前,需要在代码中进行声明,即创建该变量。
    编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。
    Lua 变量有三种类型:全局变量、局部变量、表中的域。
    Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。
    局部变量的作用域为从声明位置开始到所在语句块结束。
    变量的默认值均为 nil。

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. 赋值语句
a = "hello" .. "world"
t.n = t.n + 1

结果:

PS E:\Domes\lua\test1> lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> a = "hello" .. "world"
> print(a)
helloworld
> t = {}
> t.n = 1
> print(t.n)
1
> t.n = t.n + 1
> print(t.n)
2
>    

(1)Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。

a, b = 10, 2*x       <-->       a=10; b=2*x

(2)遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:

x, y = y, x                     -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i]         -- swap 'a[i]' for 'a[j]'

(3)当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

a. 变量个数 > 值的个数             按变量个数补足nil
b. 变量个数 < 值的个数             多余的值会被忽略

例子:

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
  1. 索引
    对 table 的索引使用方括号 []。Lua 也提供了 . 操作。
t[i]
t.i                 -- 当索引为字符串类型时的一种简化写法
gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
> t = {}
> t["key"] = "a"
> print(t["key"])
a
> print(t.key)
a
>   
  1. Lua for 循环
    Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。

Lua 编程语言中 for语句有两大类::

数值for循环
泛型for循环

(1)数值for循环

a = 5 --步长,循环的次数
for i = 1, a do
    print(i)    
end

结果

PS E:\Domes\lua\test1> lua .\test4.lua 
1
2
3
4
5
PS E:\Domes\lua\test1>

(2)泛型for循环
泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。
Lua 编程语言中泛型 for 循环语法格式:

--打印数组a的所有值  
a = {"one", "two", "three"}
for i, v in ipairs(a) do
    print(i, v)
end 

结果:

PS E:\Domes\lua\test1> lua .\test4.lua
1       one
2       two
3       three
PS E:\Domes\lua\test1>
  1. Lua 流程控制
    Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。
    控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。
--[ 0 为 true ]
if(0)
then
    print("0 为 true")
end

结果:

0true
--[ 定义变量 --]
a = 100;
--[ 检查条件 --]
if( a < 20 )
then
   --[ if 条件为 true 时执行该语句块 --]
   print("a 小于 20" )
else
   --[ if 条件为 false 时执行该语句块 --]
   print("a 大于 20" )
end
print("a 的值为 :", a)

结果:

a 大于 20
a 的值为 :    100
--[ 定义变量 --]
a = 100

--[ 检查布尔条件 --]
if( a == 10 )
then
   --[ 如果条件为 true 打印以下信息 --]
   print("a 的值为 10" )
elseif( a == 20 )
then  
   --[ if else if 条件为 true 时打印以下信息 --]
   print("a 的值为 20" )
elseif( a == 30 )
then
   --[ if else if condition 条件为 true 时打印以下信息 --]
   print("a 的值为 30" )
else
   --[ 以上条件语句没有一个为 true 时打印以下信息 --]
   print("没有匹配 a 的值" )
end
print("a 的真实值为: ", a )

结果:

没有匹配 a 的值
a 的真实值为:     100
  1. 数组
    数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。
    Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。

(1)一维数组
一维数组是最简单的数组,其逻辑结构是线性表。一维数组可以用for循环出数组中的元素,如下实例

array = {"a", "b"}

for i= 1, #array do
   print(array[i])
end

结果:

nil
a
b

(2)多维数组
多维数组即数组中包含数组或一维数组的索引键对应一个数组。

以下是一个三行三列的阵列多维数组

array = {{1,2,3}, 
        {4,5,6}}

for i= 1, #array do
   
    for j = 1,#array[i] do
        print(array[i][j])
    end
    
end

结果:

PS E:\Domes\lua\test1> lua .\test4.lua  
1
2
3
4
5
6
PS E:\Domes\lua\test1>    

先写到这。。。快爆毙了歇一会。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhopq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值