【lua 关键字、变量类型、操作符、控制语句、函数】

脑子不好,老忘,只能写下来。

关键字

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

变量和操作符

1、lua支持以下几种变量类型
print(type("string"))   string
print(type(10))          number
print(type(print))       function
print(type(true))        boolean
print(type({}))            table
print(type(nil))           nil

PS:
Userdata    嗯,这个类型专门用来和Lua的宿主打交道的。宿主通常是用C和C++来编写的,在这种情况下,Userdata可以是宿主的任意数据类型,常用的有Struct和指针。 

Thread    线程类型,在Lua中没有真正的线程。Lua中可以将一个函数分成几部份运行。如果感兴趣的话,可以去看看Lua的文档。 

2、lua变量是弱类型的,赋值什么类型,就是什么类型

3、nil
在lua里nil表示null,对于定义一个变量未赋值则是nil,对于想要删除一个变量,则将此变量赋值为nil即可

4、布尔值
lua将nil和false视为假,其他都是真,所以数字0空字符串也为真

5、数字
lua的数字没有整形,都是浮点型

6、字符串
不能像C那样直接修改字符串的某一个位置的值,而是需要创建一个新的字符串
例如:
a = "one string"
b = string.gsub(a, "one", "another")
print(a)  -- one string
print(b)  -- another string
注意:--表示lua的注释,lua用--[[ --]] 来表示注释块
在lua中操作100k或1mb的字符串是很常见的事情,可以使用单引号或者双引号来表示lua字符串
lua还提供了字符串和数字自动转换
print("10"+1)  --  11
print(10+1")   -- "10+1"
print("-5.3e-10"*"2")   --  -1.06e-09
print("hello"+1)   -- 错误不能转换

7、..是lua中字符串连接操作符,当你直接在一个数字后面使用它时,必须加上空格,否则会理解为一个点

8、字符串和数字互相转换
tonumber()
tostring()
同样也可以使用 数字加上空字符串来强制转换字符串,例如 10 .. ''
使用 -0 来强制转换数字  “10” - 0

9、获取字符串长度,在字符串前加上#号

10、表-table
在lua中使用{}来表示一个表,即对象
a = {}
k = "x"
a[k] = 0;     -- key 为 “x”, 值为0
a[20] = "great"  -- key为20, 值为great
print(a["x"])   -- 10
k=20
print(a[k]) -- great

具体用法和其他动态语言无异

11、lua中table的赋值是引用赋值

12、循环
a={}
for i=1,1000 
do 
a[i] = i*2
end

13、返回talbe最后一个key值可以用#
例如返回上面的a的最后一个key也就a的长度
print(#a)

14、lua习惯使用1开始数组第一个而不是0,因为#一般返回最后一个的key所以作为数组的长度,table.getn()也返回一样的结果。

15、table.maxn返回一个table的最大正索引

16、注意10,“10”和“+10”这3个表示不同的key,也就是可以再table中保存不同的数据,尽量避免这样存储他们

17、函数可以存储在变量中,可以作为参数传递

18、lua可以调用c语言编写的函数

19、lua中的算术表达式^表示取指数
比如 a = 3
a^3表示3的3次方,为27

20、x - x%0.01表示精确到小数点后两位的结果,其他依次类推

21、使用 ~= 来表示不等于

23、与,或,非表示and,or,not

22、x = x or v 等价于
if not x 
then 
x = v
end

23、类似于C语言的三元运算符:
and 和 or的运算结果不是true和false,而是和它的两个操作数相关。 
a and b:如果a为false,则返回a;否则返回b 
a or b:如果 a 为true,则返回a;否则返回b 

c语言:max = a>b ? a : b
lua: max = (x>y) and x or y

最有用的语句是: x = x or v,它相当于:if not x then x = v end。

24、操作符not永远只返回true或者false,not nil 返回true

25、优先级:
^
not,#,-(一元)
*,/,%
+,-
..
<,>,<=,>=,~=,==
and
or

26、talbe构造式:
days={"one","two","three"}
则表示
days[1] = "one"
days[2] = "two"
days[3] = "three"

27、table构造式2:
a = {x=1, y=2}
等价于
a={}
a.x = 1
a.y = 2

28、table写出链表代码:
list=nil
for line in io.lines()
do
list = {next = list, value = line}
end
然后我们可以这样读取每行的内容
local l = list
while l do
print(l.value)
l=l.next
end

29、还可以混合存储key和数组例如下面,利用分号隔开
a={a=1;2,3}
print(a.a)    --1
print(a[1])   --2


语句函数

1、lua允许多重赋值

a,b = 10, 2*x

2、交换x和y的值
x,y = y,x

3、如果多重赋值等号左边的变量名多余右边的值,则右边的少于左边的值会以nil代替,反之右边多余的值会被去掉
例如:
a,b,c = 0;
print(a,b,c)  -- 0,nil,nil
a,b,c = 0,0,0
print(a,b,c)  -- 0,0,0

4、一般多重赋值用来接收函数的2个返回值,比如:
a,b = f()
则a和b分别被赋值了函数f的返回值

5、全局变量和局部变量
j = 10 -- 全局变量
local i = 1 -- 局部变量
局部变量仅作用于声明它的那个块,一个块是一个程序体,例如下面,从while到end是一个程序块
x=10
local i =1
while i <= x
do
local x = i*2
print(x)
i = i + 1
end

6、显示的声明一个程序块
do
 local a = 1
 local b = 2
end

7、一个局部变量和局部变量同名的例子:
local a,b = 1,10
if a<b then
print(a)  -- 1
local a    
print(a)   --nil
end
print(a,b)   -- 1  10

8、在lua中有一种书写习惯
local foo = foo
利用全局变量赋值给局部变量可以暂存全局变量而且会加速程序

9、if语句,lua不支持switch语句
if op == '+' then
r=a+b
elseif op == '-' then
r=a-b
else
r=a*b
end

10、while语句
如果条件为假则循环结束,否则一直执行下去
local i = 1
while a[i] do
print(a[i])
i = i + 1
end

11、repeat until至少执行循环一次
repeat
line = io.read()
until line ~= ""

12、for循环
for var=exp1,exp2,exp3
<执行体>
end
var从exp1变化到exp2,每次步长为exp3,exp3是可选的,默认为1
注意i是局部变量,所以在循环体外去读取循环变量会出现错误
例如
for i=1,10 do
print(i)
end
max = i  --错误!

13、for迭代器
a={x=1,y=2;3,4,5}
for i,v in ipairs(a) do
print(i,v)
end
这里将只叠代a表格数组部分,结果为
1 3
2 4
3 5

14、for迭代器2
a={x=1,y=2;3,4,5}
for i,v in pairs(a) do
print(i,v)
end
这里将叠代所有atable的key和value,结果为
1 3
2 4
3 5
y 2
x 1

15、return和break
break用于跳出循环
return用于跳出函数

16、一个简单的函数例子
function add(a)
local sum=0
for i,v in ipairs(a) do
sum = sum + v
end
return sum
end

17、函数多重返回值
return a,b
这样就可以返回多个值

18、可以讲函数放入一个圆括号中,迫使它只返回一个值

19、unpack
x = {1,2,3,4}
print(unpack(x))
a,b,c,d = unpack(x)
print(a,b,c,d)
结果为:
1 2 3 4
1 2 3 4

20、变长参数
function add(...)
local s=0
local a,b = ...  -- 获得可变参数的前2个
print(a,b)
for i,v in ipairs({...}) do
s = s + v
end
return s
end

print(add(3,4,10,25,12))

21、select选择器
select('#', ...) 返回可变参数的长度总数
select(i, ...)  返回可变参数的第i个参数

22、当参数为一个table时,函数调用的圆括号是可有可无的
rename{old="temp.lua", new="temp1.lua"}

23、异常try catch使用 pcall
local status, err = pcall(function() error({code=121}) end)

24、throw 异常使用error函数
function foo(str)
    if type(str) ~= "string" then
        error("string expected")
    end
...
end

25、print(debug.traceback())
独立的Lua解释器用来构建错误信息的函数就是debug.traceback。你可以在任何时候调用debug.traceback获取当前运行状况的跟踪信息

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值