• [Lua学习] Lua学习笔记


    Lua 学习笔记

    Lua 变量

    Lua 变量有三种类型:全局变量、局部变量、表中的域

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

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

    变量默认值均为 nil

    赋值语句

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

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

    Lua 可以对多个变量同时赋值

    a, b = 10, 20
    x, y = y, x -- swap x for y
    

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

    • 变量个数 > 值的个数:按变量个数补足 nil
    • 变量个数 < 值的个数:多余的值会被忽略

    索引

    对 table 的索引使用方括号 [], Lua 也提供了 . 操作

    t[i]
    t.i                 -- 当索引为字符串类型时的一种简化写法
    gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
    

    Lua 循环

    While 循环

    在条件为 true 时,让程序重复地执行某些语句。执行语句前会检查条件是否为 true

    while(condition)
    do
       statements
    end
    

    for 循环

    Lua 中 for 循环可以重复执行指定语句,重复次数可在 for 语句中控制。

    Lua 编程语言中 for 语句有两大类:

    1. 数值 for 循环
    2. 泛型 for 循环

    数值 for 循环

    for var = exp1, exp2, exp3 do
        -- <执行体>
    end
    

    var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次“执行体”。

    exp3 是可选的,如果不指定,默认为 1。

    for i=1,f(x) do
        print(i)
    end
     
    for i=10,1,-1 do
        print(i)
    end
    

    for 的三个表达式在循环开始前一次性求值,以后不再进行求值。

    function f(x)  
        print("function")  
        return x*2  
    end  
    for i=1,f(2) do print(i)  
    end
    

    上面的代码输出为

    function
    1
    2
    3
    4
    

    可以看到函数 f(x) 只在循环开始前执行一次

    泛型 for 循环

    泛型 for 循环通过一个迭代器函数来遍历所有值。

    --打印数组a的所有值  
    a = {"one", "two", "three"}
    for i, v in ipairs(a) do
        print(i, v)
    end 
    

    i 是数组索引值,v 是对应索引的数组元素值。

    ipairs 是 Lua 提供的一个迭代器函数,用来迭代数组

    repeat...until 循环

    Lua 中 repeat...until 循环语句不同于 for 和 while 循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat...until 循环条件语句在当前循环结束后判断。

    repeat
       statements
    until( condition )
    

    如果条件判断语句 contidion 为 false,循环会重新开始执行,直到条件判断语句为 true 才会停止执行

    循环控制语句

    break 语句

    用于退出当前循环或语句

    goto 语句

    将控制流程无条件地转到被标记的语句处

    语法格式:

    goto label
    

    label 的格式为:

    ::label::
    

    例:

    local a = 1
    ::label:: print("--- goto label ---")
    
    a = a+1
    if a < 3 then
        goto label   -- a 小于 3 的时候跳转到标签 label
    end
    

    有了 goto,可以实现 continue 的功能:

    for i=1, 3 do
        if i <= 2 then
            print(i, "yes continue")
            goto continue
        end
        print(i, " no continue")
        ::continue::
        print([[i'm end]])
    end
    

    控制流程

    if 语句

    if(布尔表达式)
    then
       --[ 在布尔表达式为 true 时执行的语句 --]
    end
    

    要注意的是 Lua 中 0 为 true。

    if...elseif...else 语句

    if( 布尔表达式 1)
    then
       --[ 在布尔表达式 1 为 true 时执行该语句块 --]
    
    elseif( 布尔表达式 2)
    then
       --[ 在布尔表达式 2 为 true 时执行该语句块 --]
    
    elseif( 布尔表达式 3)
    then
       --[ 在布尔表达式 3 为 true 时执行该语句块 --]
    else 
       --[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
    end
    

    函数

    函数定义

    optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
        function_body
        return reslt_params_comma_separated
    end
    
    • optional_function_scope: 函数作用范围,全局/局部
    • function_name: 函数名称
    • argument1, argument2, argument3..., argumentn: 函数参数
    • function_body: 函数体
    • reslt_params_comma_separated: 返回值,可以返回多个值,每个值以逗号隔开

    实例

    function max(num1, num2)
    
       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end
    
       return result;
    end
    

    Lua 中函数也可作为参数传递给参数

    可变参数

    在函数参数列表中使用三点 ... 表示函数有可变的参数。

    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))
    

    可以通过 `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))
    

    有时候我们可能需要几个固定参数加上可变参数,固定参数必须放在可变长参数之前

    • select('#', ...) 返回可变参数的长度
    • select(n, ...) 返回从起点 n 开始到结束位置的所有参数列表

    运算符

    Lua 提供集中运算符类型

    • 算数运算符
    • 关系运算符
    • 逻辑运算符
    • 其他运算符

    算数运算符

    • + - * / 加减乘除
    • % 取余
    • ^

    关系运算符

    • == 等于
    • ~= 不等于
    • > 大于,< 小于
    • >= 大于等于,<= 小于等于

    逻辑运算符

    • and
    • or
    • not

    其他运算符

    • .. 连接两个字符串
    • # 返回字符串或表的长度
  • 相关阅读:
    Mat
    分治法-最近点对问题
    动态规划作业-最长公共子序列问题
    动态规划作业-多段图的最短路径问题
    OpenCV+VisualStudion2017配置
    R入门(二)-对象以及它们的模式和属性
    Big number
    R入门(一)
    Spring-aop
    Spring-ioc
  • 原文地址:https://www.cnblogs.com/huihao/p/15811079.html
Copyright © 2020-2023  润新知