Lua学习

Lua

一.数据类型

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型描述
nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean包含两个值:false和true。
number表示双精度类型的实浮点数
string字符串由一对双引号或单引号来表示
function由 C 或 Lua 编写的函数
userdata表示任意存储在变量中的C数据结构
thread表示执行的独立线路,用于执行协同程序
tableLua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

二.变量

变量在使用前,需要在代码中进行声明,即创建该变量。Lua 变量有三种类型:全局变量、局部变量、表中的域。

Lua 中的变量全是全局变量,哪怕是语句块或是函数里,除非用 local 显式声明为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束。

变量的默认值均为 nil。

赋值

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

a = "hello" .. "world"
t.n = t.n + 1

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

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]'

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

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

三.循环

Lua 语言提供了以下几种循环处理方式:

循环类型描述
while 循环在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。
for 循环重复执行指定语句,重复次数可在 for 语句中控制。
repeat…until重复执行循环,直到 指定的条件为真时为止
循环嵌套可以在循环内嵌套一个或多个循环语句(while do … end;for … do … end;repeat … until;)
循环控制语句

循环控制语句用于控制程序的流程, 以实现程序的各种结构方式。

Lua 支持以下循环控制语句:

控制语句描述
break 语句退出当前循环或语句,并开始脚本执行紧接着的语句。
goto 语句将程序的控制点转移到一个标签处。

四.流程控制

控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。

要注意的是Lua中 0 为 true

实例:

*--[ 0 为 true ]*
**if**(0)
**then**
  print("0 为 true")
**end**

以上代码输出结果为:

0 为 true

Lua 提供了以下控制结构语句:

语句描述
if 语句if 语句 由一个布尔表达式作为条件判断,其后紧跟其他语句组成。
if…else 语句if 语句 可以与 else 语句搭配使用, 在 if 条件表达式为 false 时执行 else 语句代码。
if 嵌套语句你可以在ifelse if中使用一个或多个 ifelse if 语句 。

五.函数

函数定义

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: 函数参数,多个参数以逗号隔开,函数也可以不带参数。

  • function_body: 函数体,函数中需要执行的代码语句块。

  • result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。

  • 以下实例定义了函数 max(),参数为 num1, num2,用于比较两值的大小,并返回最大值:

  • 实例

  • *--[[ 函数返回两个值的最大值 --]]*
    **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))
    
  • 以上代码执行结果为:

  • 两值比较最大值为     10
    两值比较最大值为     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)
    
  • 以上代码执行结果为:

  • 这是打印函数 -   ##    10    ##
    这是打印函数 -   ##    7    ##
    

  • 多返回值
  • Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil)。

  • > s, e = string.find("www.runoob.com", "runoob") 
    > print(s, e)
    5    10
    
  • Lua函数中,在return后列出要返回的值的列表即可返回多值,如:

  • 实例

  • **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}))
    
  • 以上代码执行结果为:

  • 23    3
    

  • 可变参数
  • Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 表示函数有可变的参数。

  • function add(...)  
    local s = 0  
      for i, v in ipairs{...} do   --> {...} 表示一个由所有变长参数构成的数组  
        s = s + v  
      end  
      return s  
    end  
    print(add(3,4,5,6,7))  --->25
    
  • 我们可以将可变参数赋值给一个变量。

  • 例如,我们计算几个数的平均值:

  • 实例

  • **function** average(...)
      result = 0
      **local** arg={...}   *--> 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))
    
  • 以上代码执行结果为:

  • 总共传入 6 个数
    平均值为    5.5
    
  • 我们也可以通过 select("#",…) 来获取可变参数的数量:

  • 实例

  • **function** average(...)
      result = 0
      **local** arg={...}
      **for** i,v **in** ipairs(arg) **do**
       result = result + v
      **end**
      print("总共传入 " .. select("#",...) .. " 个数")
      **return** result/select("#",...)
    **end**
    
    print("平均值为",average(10,5,3,4,5,6))
    
  • 以上代码执行结果为:

  • 总共传入 6 个数
    平均值为    5.5
    
  • 有时候我们可能需要几个固定参数加上可变参数,固定参数必须放在变长参数之前:

  • 通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select(’#’, …) 或者 select(n, …)

    • select(’#’, …) 返回可变参数的长度。
    • select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表。
  • 调用 select 时,必须传入一个固定实参 selector(选择开关) 和一系列变长参数。如果 selector 为数字 n,那么 select 返回参数列表中从索引 n 开始到结束位置的所有参数列表,否则只能为字符串 #,这样 select 返回变长参数的总数。

六.运算符

  • 算术运算符
  • 下表列出了 Lua 语言中的常用算术运算符,设定 A 的值为10,B 的值为 20:

  • 操作符描述实例
    +加法A + B 输出结果 30
    -减法A - B 输出结果 -10
    *乘法A * B 输出结果 200
    /除法B / A 输出结果 2
    %取余B % A 输出结果 0
    ^乘幂A^2 输出结果 100
    -负号-A 输出结果 -10
  • 关系运算符
  • 下表列出了 Lua 语言中的常用关系运算符,设定 A 的值为10,B 的值为 20:

  • 操作符描述实例
    ==等于,检测两个值是否相等,相等返回 true,否则返回 false(A == B) 为 false。
    ~=不等于,检测两个值是否相等,不相等返回 true,否则返回 false(A ~= B) 为 true。
    >大于,如果左边的值大于右边的值,返回 true,否则返回 false(A > B) 为 false。
    <小于,如果左边的值大于右边的值,返回 false,否则返回 true(A < B) 为 true。
    >=大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false(A >= B) 返回 false。
    <=小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false(A <= B) 返回 true。
  • 逻辑运算符
  • 下表列出了 Lua 语言中的常用逻辑运算符,设定 A 的值为 true,B 的值为 false:

  • 操作符描述实例
    and逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。(A and B) 为 false。
    or逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。(A or B) 为 true。
    not逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。not(A and B) 为 true。
  • 其他运算符
  • 下表列出了 Lua 语言中的连接运算符与计算表或字符串长度的运算符:

  • 操作符描述实例
    连接两个字符串a…b ,其中 a 为 "Hello " , b 为 “World”, 输出结果为 “Hello World”。
    #一元运算符,返回字符串或表的长度。#“Hello” 返回 5

七.字符串

字符串或串(String)是由数字、字母、下划线组成的一串字符。

Lua 语言中字符串可以使用以下三种方式来表示:

  • 单引号间的一串字符。
  • 双引号间的一串字符。
  • [[]] 间的一串字符。
字符串操作

Lua 提供了很多的方法来支持字符串的操作:

序号方法 & 用途
1string.upper(argument): 字符串全部转为大写字母。
2string.lower(argument): 字符串全部转为小写字母。
3**string.gsub(mainString,findString,replaceString,num)**在字符串中替换。mainString 为要操作的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:> string.gsub("aaaa","a","z",3); zzza 3
4string.find (str, substr, [init, [end]]) 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。> string.find("Hello Lua user", "Lua", 1) 7 9
5string.reverse(arg) 字符串反转> string.reverse("Lua") auL
6string.format(…) 返回一个类似printf的格式化字符串> string.format("the value is:%d",4) the value is:4
7string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。> string.char(97,98,99,100) abcd > string.byte("ABCD",4) 68 > string.byte("ABCD") 65 >
8string.len(arg) 计算字符串长度。string.len("abc") 3
9string.rep(string, n) 返回字符串string的n个拷贝> string.rep("abcd",2) abcdabcd
10 链接两个字符串> print("www.runoob.".."com") www.runoob.com
11string.gmatch(str, pattern) 回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end Hello Lua user
12string.match(str, pattern, init) string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。 在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。> = string.match("I have 2 questions for you.", "%d+ %a+") 2 questions > = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)")) 2, "questions"
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值