LuatOS——基础语法

认识lua

lua是一种轻量小巧的脚本语言,它用标准C语言编写并以源代码形式开放。标志Lua虚拟机可以很方便的嵌入别的程序中,从而为应用程序提供灵活的扩展功能。而整个Lua虚拟机编译后仅仅100余k,经过适当的裁剪可能做到更小,十分适合嵌入式的开发。

Lua的运行速度占有绝对优势,这些都决定了Lua作为嵌入式脚本的最佳选择。

输出

在Lua中,可以使用print函数打印出你想要的结果。使用函数名(参数)来执行。

print("liustu.com.cn-Lua")

代码注释

注释可是使用–用来注释一行;
使用–[[内容]]

--print("这段内容不被执行")
--[[print("这段内容不被执行")]]

变量

number变量

变量,变量可以赋予你想赋予的内容,但必须是Lua的合法类型。

nil

nil等同于NULL,标识没有声明的值。

赋值语句

赋值是改变一个变量的最常见的方式。a=b即将b的值赋值给a。

Lua可以对多个变量同时赋值,变量用逗号分开,赋值语句右边的值以此赋给左边的变量。

a,b = 1,2

当左右的数量不一致时,要求变量个数>值得个数,变量多余的会为nil;变量个数<值得个数,多余的值被忽略。

使用 a, b = b, a可是实现数据得交换。

算数运算符

Lua也存在运输算符,包括:

+ 加法
– 减法
* 乘法
/ 整除
% 取余
^ 幂乘
– 负号

字符串

string类型变量

字符串用来存储你想要存储的文本信息。在Lua中字符串可以用三种方式表示:

1、单引号间的一串字符
2、双引号间的一串字符
3、[[和]]间的一串字符

其实[[和]]的格式是保留出入的格式,下面为测试代码

--双引号间的一串字符
str1 = "Lua"
--单引号间的一串字符
str2 = 'Lua'
--[[和]]--间的一串字符
str3 = [[Lua]]
str4 = [[使用双括号时,甚至能包含换行数据
换行了
最后一行]]

当你输出字符串的时候,print支持自主拼接字符串,例如

print("s1,s2,s3的值:",s1,s2,s3,"s1,s2,s3的值:",s1,s2,s3)

转义字符

Lua语言支持转义字符,和C语言相似。

转义字符含义
\n换行(LF),将当前位置移到下一行开头
\r回车(CR),将当前位置移到本行开头
\\反斜杠字符
单引号
双引号
\0空字符(NULL)
\ddd1到3位八进制数所代表的任意字符
\xhh1到2位十六进制所代表的任意字符

字符串拼接

除了上述可以使用print直接进行拼接字符串输出之外,也可以直接对字符串进行拼接赋值,使用的符号为“..”。如下示例:

all = s1 .. s2 .. s3

number转换string

可以把number类型的变量和string类型的变量拼接起来,组成一个新的string。使用tostring函数可是实现。

string转number

同样,可以将string转为number,字符串存储的内容可能是一个字符串,但是代表一个数字,就可以使用函数tonumber函数实现。

逻辑运算

布尔型和比较运算

布尔型只有两个类型:true和false;Lua中将nil看作为false,其他都是true,在lua中0也表示真
Lua中也有多个关系运算符,用于判断数据之间的关系。其中不等符号(~=)与C语言的不等(!=) 存在差异。

符号含义
==等于,检测两个值是否相等,相等返回 true,否则返回 false
~=不等于,检测两个值是否相等,相等返回 false,否则返回 true
>大于,如果左边的值大于右边的值,返回 true,否则返回 false
<小于,如果左边的值大于右边的值,返回 false,否则返回 true
>=大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false
<=小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false

逻辑运算符

逻辑运算符基于布尔型的值来判断,并给出结果;在C语言中使用(&&、||、!),在Lua中使用(and、or、not)表示。

符号含义
and逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B
or逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B
not逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false

分支判断

条件判断

在Lua中,可以使用if语句来判断。下面是if语句的结构:

if 条件 then
    --执行语句
end

当然Lua中可以使用if语句进行判断,同时可以使用else语句,表示多个分支判断

if 条件1 then
    满足条件1
elseif 条件2 then
    不满足条件1,但满足条件2
else
    前面条件全都不满足
end

函数

Lua中也有函数的概念,在Lua中函数的调用类似python中,格式为:

function 函数名(参数1,参数2,参数3...)
   --函数体
end
函数名()

在Lua中,函数也是一种变量类型,所有函数名实际上也是一个变量,里面存储的是一个函数,例如:

a = 函数名  --把hello函数同时赋值给a变量
a()
函数名()
--a和hello变量指向同一个函数
--所以执行结果和hello相同

因为函数只是一个变量,甚至可以直接声明一个变量为函数,例如:

a = funtion()
    print("nihao")
    end
a()

local变量

在C语言中,变量声明在函数内时默认为函数的局部变量,当函数结束时变量内存自动释放;而在Lua中默认为全局变量,我们需要使用local标识符创建一个临时变量。使用local创建的局部变量,作用域只在代码块内有效。

function fun()
    loacl n = 2
    print(n)
end
fun()
print(n)
--结果为fun函数内的输出为2,函数外的输出为nil

函数参数

函数参数等价于一个函数内部创建的local变量,类似于c语言中的实参与形参的概念。

函数返回值

函数定义时候没有声明返回值类型,我们在函数中使用return进行返回函数的返回值给调用它的函数。并且return允许返回一个值,也可以返回多个值,使用逗号间隔多个数据类型。

table

认识数组

数组,使用一个变量明,存储一系列的值。
在Lua中,我们可以使用table来实现这个功能;在Lua中,table是一系列元素的集合,使用大括号表示,其中元素之间通过逗号间隔。
table类似于C语言中的数组,可以直接使用下标调用table中的元素,但是table的下标从1开始,以此类推。

一般的计算机语言数组基本都是不可变长度的,这里的table为可变长度。

table可是包括任何类型的数据,这一概念就就C语言中的数组概念有区别。table也可以存储函数的变量类型。

table下标

table中每个元素的下标都是自动从1开始的,事实上,下标可以跳过某个顺序。同样可以在声明后进行赋值。

t = {
    [1] = 1,
    [2] = "abc",
    [5] = function() return 0 end,
    [8] = 0x12,
}
t[101] = "add"

table的下不局限于是数字,同时可以是字符串,例如:

t = {
    ["apple"] = 3,
    pear = 4,   --这里的pear标识"pear"
}
--使用t.apple的方式调用table中的元素
print(t.apple)
--使用t["apple"]的方式调用table中的元素
print(t["apple"])

Lua全局变量和table

table可以直接使用table[下标]或者table.string下标来访问元素。实际上,在Lua中,所有的全局变量全部存储在一个大的table中,名为_G。

table.concat

table.concat类似字符串拼接,把一个label中所有字符或者数字类型的元素拼接成字符串。table.concat(table名, sep),其中seq作为可选参数,表示连接间隔符,默认为空。

循环

while循环

while循环语句的格式为:

while 循环条件 do 
    --执行的代码
end

for循环

在Lua中for循环与while十分相似,但for循环可以更加简洁的表达中间累加的量。
for循环的格式为:

for 临时变量名=初始值, 结束值, 步长 do
    --循环的代码
end
其中步长可以省略,默认为1;临时变量可以直接在代码区使用,但是不能被修改;循环每次会自动加步长值,并且在到达结束值后停止循环。

中断循环

C语言中中断循环使用break、结束当前循环使用continue;Lua中结束本次循环使用break。
我们常见使用死循环,整体逻辑当符合if条件时,调用break跳出当前死循环。

String库

string.sub

查找字符串某个位置之间的字符内容,格式为:

string.sub(s, i [,j])

s表示处理的字符串;
i为要索引的起始下标;
j表示索引的结束下标位置,j可以省略,默认为-1即字符串的末尾。
i和j都可以为负数,负数表示倒数的下标

string.req

返回字符串s的n次拷贝

string.rep(s, n)

string.len

接收一个字符,返回他的长度

string.len(s)

大小写转换

string.lower(s)    --将大写字符全部转换为小写字符
string.upper(s)    --将小写字符全部转换为大写字符

string.format

参考formatstring格式化,返回…内容的格式化版本。

string.format(formatstring, ...)

格式化方式与C语言中的printf的规则相同。

print(string.format("%.4f", 3.1415926))     -- 保留4位小数

string的本质

字符串是用来存储一串字符的,但是它的本质就是一串数字,通过使用ASCII码进行保存。

string.char

接收多个整数,返回对对应的ASCII码字符,可以接收0~255个字符。返回值为转换后的字符串。

str1 = string.char(0x30,0x31,0x32,0x33)

string.byte

返回字符串的ASCII值。

string.byte(s [, j [, i]])

参数s为要转换的字符串,j、i可以胜率,j默认为1,i默认为j;i表示转换的下标开始,j表示转接范围结束的下标。

string.find

在字符串中寻找匹配的字符位置。

string.find(s, p[,init [,plain]])

在字符串s中寻找匹配p字符串的数据;如果成功找到,那么会返回p字符串在s字符串中出现的开始位置和结束位置。

第三个参数init默认为1,表示从第一几个字符开始匹配;当init为负数时,从倒数init的位置开始匹配。
第四个参数默认为flase,当为true时,只会把p看作一个字符串对待。(与正则匹配相关)

string.gsub

string.gsub(s, p, r[,n])

将目标字符串s中的p子字符串替换为r,n为可选参数,表示限制替换次数。
返回值有两个一个是被替换后的字符串,第二个是替换多少次。

跨文件调用

在lua中将代码放到不同的文件中,通过文件来区分这些代码的功能。文件格式为.lua。

我们将一个函数放到一个文件中,通过文件调用的方式执行这个函数:

  • 创建名为fun.lua的文件,将函数放到文件中
  • 在其他文件中引用该文件,则可调用文件内的函数
--fun.lua
local function getnumtable(max)
    local t = {}
    for i = 1, max do
        t[i] = i
    end
    return t;
end

--main.lua
local tool = require("fun")
local list = tool.getnumtable(12)

调用require接口后,Lua虚拟机会自动加载你调用的文件,执行文件的内容,然后再返回文件里return的结果。

如果您觉得这篇文章不错,且手里较为宽裕,可以支持一下博主,一分也是缘分😊
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇