lua ~~~~Ⅱ
参考文档:
https://www.runoob.com/lua/lua-data-types.html
https://www.w3cschool.cn/lua/
https://zhuanlan.zhihu.com/p/141875196
本篇学习下面的内容:
- 变量
- 循环
- 流程控制
- 函数
- 运算符
变量
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
赋值
a = "hello" .. "world"
t.n = t.n + 1
-- 对多个变量同时赋值
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]'
-- 当变量个数和值的个数不一致时,
-- 变量个数 > 值的个数 按变量个数补足nil
-- 变量个数 < 值的个数 多余的值会被忽略
索引
对 table 的索引使用方括号 []。Lua 也提供了 . 操作。
其实这里就可以理解为 java的Map(当然这是举例,其实是有区别的,因为table是我觉得是一种比较混杂的数据结构)
t[i]
t.i -- 当索引为字符串类型时的一种简化写法
gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
循环
while循环
:
a=10
while( a < 20 )
do
print("a 的值为:", a)
a = a+1
end
for循环
-- 数值循环
for i=1,f(x) do
print(i)
end
for i=10,1,-1 do
print(i)
end
#!/usr/local/bin/lua
function f(x)
print("function")
return x*2
end
for i=1,f(5) do print(i)
end
-- 泛型for循环
-- 打印数组a的所有值
-- i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。
for i,v in ipairs(a)
do print(v)
end
#!/usr/local/bin/lua
days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
for i,v in ipairs(days) do print(v) end
Lua repeat...until
-- 循环语法格式 相当于 do while
repeat
statements
while( condition )
--[ 变量定义 --]
a = 10
--[ 执行循环 --]
repeat
print("a的值为:", a)
a = a + 1
until( a > 15 )
嵌套循环
: 循环的嵌套
循环控制语句
只有 break
--[ 定义变量 --]
a = 10
--[ while 循环 --]
while( a < 20 )
do
print("a 的值为:", a)
a=a+1
if( a > 15)
then
--[ 使用 break 语句终止循环 --]
break
end
end
流程控制
-- if then end
--[ 0 为true ]
if(0)
then
print("0 为真")
end
-- if then elseif then else end
if( 布尔表达式 1)
then
--[ 在布尔表达式 1 为 true 时执行该语句块 --]
elseif( 布尔表达式 2) then
--[ 在布尔表达式 2 为 true 时执行该语句块 --]
elseif( 布尔表达式 3) then
--[ 在布尔表达式 3 为 true 时执行该语句块 --]
else
--[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
end
-- 嵌套
if( 布尔表达式 1)
then
--[ 布尔表达式 1 为 true 时执行该语句块 --]
if(布尔表达式 2)
then
--[ 布尔表达式 2 为 true 时执行该语句块 --]
end
end
函数
在Lua中,函数是对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以用来计算一些值。
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
-
optional_function_scope
-
该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
-
function_name: 函数名称
-
argument1, argument2, argument3…, argumentn : 参数
-
result_params_comma_separated:函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)
if (num1 > num2) then
result = num1;
else
result = num2;
end
return result;
end
-- 调用函数
print("两值比较最大值为 ",max(10,4))
print("两值比较最大值为 ",max(5,6))
-- Lua 中我们可以将函数作为参数传递给函数
myprint = function(param)
print("这是打印函数 - ##",param,"##")
end
function add(num1,num2,functionPrint)
result = num1 + num2
-- 调用传递的函数参数
functionPrint(result)
end
myprint(10)
-- myprint 函数作为参数传递
add(2,5,myprint)
-- 多值返回
s, e = string.find("www.w3cschool.cn", "w3cschool")
print(s, e)
function maximum (a)
local mi = 1 -- 最大值索引
local m = a[mi] -- 最大值
for i,val in ipairs(a) do
if val > m then
mi = i
m = val
end
end
return m, mi
end
print(maximum({8,10,23,12,5}))
-- 可变参数
-- Lua将函数的参数放在一个叫arg的表,#arg 表示传入参数的个数。
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. #arg .. " 个数")
return result/#arg
end
print("平均值为",average(10,5,3,4,5,6))
运算符
算术运算符
设定 A 的值为10,B 的值为 20
操作符 | 描述 | 实例 |
---|---|---|
+ | 加法 | A + B 输出结果 30 |
- | 减法 | A - B 输出结果 -10 |
* | 乘法 | A * B 输出结果 200 |
/ | 除法 | B / A 输出结果 2 |
% | 取余 | B % A 输出结果 0 |
^ | 乘幂 | A^2 输出结果 100 |
- | 负号 | -A 输出结果v -10 |
关系运算符
A 的值为10,B 的值为 20
操作符 | 描述 | 实例 |
---|---|---|
== | 等于,检测两个值是否相等,相等返回 true,否则返回 false | (A == B) 为 false。 |
~= | 不等于,检测两个值是否相等,相等返回 false,否则返回 true< | (A ~= B) 为 true。 |
> | 大于,如果左边的值大于右边的值,返回 true,否则返回 false | (A > B) 为 false。 |
< | 小于,如果左边的值大于右边的值,返回 false,否则返回 true | (A < B) 为 true。 |
>= | 大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false | (A >= B) is not true. |
<= | 小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false | (A <= B) is true. |
逻辑运算符
设定 A 的值为 true,B 的值为 false
操作符 | 描述 | 实例 |
---|---|---|
and | 逻辑与操作符。 如果两边的操作都为 true 则条件为 true。 | (A and B) 为 false。 |
or | 逻辑或操作符。 如果两边的操作任一一个为 true 则条件为 true。 | (A or B) 为 true。 |
not | 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。 | not(A and B) 为 true。 |
其他运算符
操作符 | 描述 | 实例 |
---|---|---|
… | 连接两个字符串 | a…b ,其中 a 为 "Hello " , b 为 “World”, 输出结果为 “Hello World”。 |
# | 一元运算符,返回字符串或表的长度。 | #“Hello” 返回 5 |
运算符优先级
从高到低的顺序
^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
-- 除了^和..外所有的二元运算符都是左连接的。
a+i < b/2+1 --> (a+i) < ((b/2)+1)
5+x^2*8 --> 5+((x^2)*8)
a < y and y <= z --> (a < y) and (y <= z)
-x^2 --> -(x^2)
x^y^z --> x^(y^z)