编程日记 - 零基础学习《Lua - 脚本语言》教程

推荐阅读书籍《Lua - 程序设计》第四版

全局变量

全局变量不需要声明 没有初始化的全局变量也不会出错,只是得到结果nil

print(a)	--> nil
a = 1
print(a) 	--> 1

删除全局变量,直接赋值nil即可

a = nil
print(a)	-->nil

Lua保留字

保留字:以下字符为Lua的保留字,不能当作标识符。
注意:Lua是大小写敏感的.
注释:单行注释:--
多行注释:--[[ --]]

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

变量类型、值

nil

Lua中特殊的类型,一个全局变量没有被赋值默认值为nil;给全局变量赋值nil可以删除该变量

Booleans

取值false和true。注意Lua中所有的值都可以作为条件。在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真

Numbers

可以做实数也可以做整数。Lua可以处理任何长整数

Strings

Lua的字符串是不可以修改的,你可以重新创建个变量

a = 'Carlos'
c = "Carlos"
print(a)		--> Carlos
print(c)		--> Carlos

可以使用单引号或者双引号表示字符串
还可以使用[[...]]表示字符串

\a            
\b             -- 后退
\f             -- 换页
\n            -- 换行
\r            -- 回车
\t            -- 制表
\v 
\\            -- "\"
\"            -- 双引号
\'             -- 单引号
\[             -- 左中括号
\]            -- 右中括号

Lua会自动在stringnumbers之间自动进行类型转换

print("5" + 1)             --> 6
print("5 + 1")             --> 5 + 1

当Lua碰到string碰到数字时,自动转换数字为string

print(50 .. 50)      --> 5050

..连接字符串 在一个数字后面写…时,必须加上空格以防止被解释错。
tonumberstring转成数字,如果string不是正确的数字返回nil
tostring数字转成字符串

Functions

Lua可以调用lua或者C实现的函数,Lua所有标准库都是用C实现的。标准库包括string库、table库、I/O库、OS库、算术库、debug库。
函数可以是一个变量、函数的参数、作为函数的返回值

Userdata

userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外没有预定义的操作。userdata用来描述应用程序或者使用C实现的库创建的新类型。

算术运算

+ - * / ^ (加减乘除幂)
- (负值)
这些运算符的操作数都是实数。
< > <= >= == ~=
返回结果为false或者true
Lua比较数字按传统的数字大小进行,比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。
and or not and的优先级比or高。
逻辑运算符认为false和nil是假,其他为真,0也是true.
andor的运算结果不是true和false,而是和它的两个操作数相关。

a and b	-->如果a为false,则返回a,否则返回b
a or  b        -- 如果a为true,则返回a,否则返回b
--例子
print(5 and 10)		--> 10
print(nil and 1)        --> nil
print(5 or 10)		--> 5
print(false or 1)		-->1

实用的小技巧

a = nil
c = 10
x = a or c
print(x)		-->10

以上写法等于以下写法

if not a then
	x = c
end

not的结果只返回false或者true

print(not nil)           --> true
print(not false)         --> true
print(not 0)             --> false
print(not not nil)       --> false

..连接字符串 前面就演示过
优先级高到低

^
not    - (unary)
*      /
+     -
..
<      >      <=     >=     ~=     ==
and
or

除了^和…外所有的二元运算符都是左连接的。

表的构造

表是Lua最强大的功能
最简单的构造{}用来创建一个空表,直接初始化数组

t = {1,2,3,4,}
print(t[0])		-->0  --lua的索引是从1开始的,你也可以设置0
print(t[2])		-->2 
print(#t)		-->4 
--构造表可以使用任何表达式初始化
tt = {a = 0, b = 0}  等价于 tt = {}; tt.a = 0; tt.b = 0

#遍历表中的所有数组
我们可以向表添加或删除任何类型的域

t = {x = 0, y = 0,c = "carlos"}
x = {}
t[1] = "数组"
x.f = t
print(t["x"])   -->0
print(t[1])     -->数组
print(x.f[1])   -->数组
x.f[1] = nil
print(x.f[1])   -->nil

注意:不推荐数组下标从0开始,否则很多标准库不能使用。
在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。

赋值

赋值是改变一个变量的值和改变表域的最基本的方法。

a = "carlos" .. "lua" 		--> carloslua
t = {}
t.n = 5
t.n = t.n + 1
print(t.n)		-->6

可以对多个变量赋值,变量和值用,分开,右边赋值会传递到左边的变量

a,b,c = 1,2,3 		等价于 a = 1 b = 1 c = 1

赋值语句是从右边计算再传到左边,所以我们可以交换变量的值

a,b = 5,10
a,b = b,a
print(a,b)      -->10 5

当变量个数和值的个数不一致

变量个数 > 值的个数		--多出的变量个数补充为nil
例子:a,b,c = 1,2 
print(a,b,c)    -- 1 2 nil
变量个数 < 值的个数 		--多出的值会被忽略
例子:a,b = 1,2,3
print(a,b)      -- 1 2

除了交换变量还可以讲函数调用返回到变量

function f ()
    return 1,2
end

a,b = f()
print(a,b)      -- 1 2

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

局部变量与代码块

局部变量只在被声明的代码块内有效
代码块:一个函数,一个控制结构,或者变量被声明的文件或者文本串

local i = 50

function f ()
    local x = 20
    print(x,"函数内有效")    --> 20
end

print(x,"已在函数外无效")    --> nil
print(i,"这个文件内有效")    --> 50

多使用局部变量,避免重名冲突,访问局部变量比全局变量速度要快
还可以使用doend来划分一个界限

do
    local i = 20
    print(i,"界限内  有值")    -->20
end
print(i,"界限外,无效")    -->nil

这样更好的控制了局部变量的范围,是不是很舒服

控制结构(if )

控制结构的结果可以是任何值
false和nil是假,其他是真

条件结构
--第一种
local i = 20
if i > 1 then
    print("值为",i)
end
--第二种 else
if i > 20 then
    print("值为",i)
else 
    print("大于20")
end 
--第三种 elseif
if i > 1 then
    print("值为",i)
    local b = 1
elseif b < 5 then
    print("值大于5")
    else
    print("大于20")
    end
循环结构
--while 循环 判断条件为false中止循环
local i = 0
while i<20 do
    print(i) 	--> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    i = i + 1
    end
-- 那如果我们要在中途退出循环呢?那我们加一个break
local i = 0
while i<20 do
    print(i)  -->0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    i = i + 1
    if i > 15 then
        print("中止")   -->中止
        break
        end
    end
--repeat-until 循环
local i = 1
repeat
    print(i)    --> 1 2 3 4 5
    i = i + 1
until i > 5
--for 数值循环 控制变量i是局部变量自动声明,只在循环内有效
for i=10,5,-1 do
    print(i)    -->10 9 8 7 6 5
end
--需要保留控制变量的值,在循环中将其保存
local f = nil
for i=1,10,1 do
       f = i        
end
print(f)    --> 10
break,return语句

break语句用来退出当前循环(forrepeatwhile)循环外部不可以使用
return用来从函数返回结果,当一个函数自然结束时,结尾会有一个默认的return

--Lua语法要求breakreturn只能出现在block的结尾一句
--有时候需要在block的中间使用return或者break 可以用do.end
function f (i)
    do 
        return i  
    end        
end
print(f(123)) 		--> 123

函数

返回值
--return 列出要返回的值
function f (i)
    local a = 1             
    local aa = i[a]    
          
    for i,v in ipairs(i) do
       if val > a then
           aa = i
           a = v
       end
    end
    return a, aa
end
print(f({1,2,3,4,5,6}))     --> 6 6
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值