• lua学习之基本语法


    • 赋值语句
      >赋值是改变一个变量的值和改变表域的最基本的方法
      a = "hello" .. "world"
      b = 10
      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. 变量个数 < 值的个数 多余的值会被忽略

      a, b, c = 0, 1
      print(a,b,c) --> 0 1 nil
      a, b = a+1, b+1, b+2 -- value of b+2 is ignored
      print(a,b) --> 1 2
      a, b, c = 0
      print(a,b,c) --> 0 nil nil

      >多值赋值经常用来交换变量,或将函数调用返回给变量

      --用f()返回两个值,第一个赋给 a,第二个赋给 b
      a, b = f()
    • 局部变量与代码块(block)

      使用 local 创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个 chunk(变量被声明的那个文件或者文本串)

      x = 10
      local i = 1  -- local to the chunk
      while i<=x do
      local x = i*2 -- local to the while body
      print(x)  --> 2, 4, 6, 8, ...
      i = i + 1
      end
      if i > 20 then
      local x  -- local to the "then" body
      x = 20
      print(x + 2)    
      else
      print(x)  --> 10 (the global one)
      end
      print(x)  --> 10 (the global one)

      >应该尽可能的使用局部变量,有两个好处:
        1. 避免命名冲突
        2. 访问局部变量的速度比全局变量更快.
      我们给 block 划定一个明确的界限:do..end 内的部分。当你想更好的控制局部变量的作用范围的时候这是很有用的

    • 控制结构语句
      >if语句
      -- 1
      if conditions then
          --then-part
      end;
      -- 2
      if conditions then
         --then-part
      else
          --else-part
      end;
      -- 3
      if conditions then
          --then-part
      elseif conditions then
          --elseif-part
      .. --->多个 elseif
      else
          --else-part
      end;


      2.while语句
      while condition do
      statements;
      end;


      3.repeat-until 语句

      -- 重复直到某个条件成立
      repeat
      statements;
      until conditions;


      4.for语句(有两大类)
      第一,数值 for 循环

      for var=exp1,exp2,exp3 do
      loop-part
      end

      for 将用 exp3 作为 step exp1(初始值)exp2(终止值),执行 loop-part。其中exp3 可以省略,
      默认 step=1
      看下面例子:

      for i=1,10 do
      print(i)
      end
      -- step默认为1,输出1,2,3,4,5,6,7,8,9,10
      
      for i=1,10,2 do
      print(i)
      end
      -- step设置为2,输出1,3,5,7,9

      注意:
      1、三个表达式只会被计算一次,并且是在循环开始前
      2、控制变量 var 是局部变量自动被声明,并且只在循环内有效
      3、循环过程中不要改变控制变量的值,那样做的结果是不可预知的。如果要退出循环,使用 break 语句

      >查找一个元素的位置
      -- find a value in a list
      local found = nil
      for i=1,a.n do
          if a[i] == value then
              found = i -- save value of 'i'
              break
          end
      end
      print(found)
      第二,泛型for循环
      --范型 for 遍历迭代子函数返回的每一个值
      for i,v in ipairs(a) do print(v) end
      
      --遍历表 key 
      -- print all keys of table 't'
      for k in pairs(t) do print(k) end

      再看一个例子,假定有一个表

      days = {"Sunday", "Monday", "Tuesday", "Wednesday",
      "Thursday", "Friday", "Saturday"}

      现在想把对应的名字转换成星期几,一个有效地解决问题的方式是构造一个反向表

      revDays = {["Sunday"] = 1, ["Monday"] = 2,
                 ["Tuesday"] = 3, ["Wednesday"] = 4,
                 ["Thursday"] = 5, ["Friday"] = 6,
                 ["Saturday"] = 7}    

      获得Tuesday

      x = "Tuesday"
      print(revDays[x]) --> 3

      >我们不需要手工,可以自动构造反向表

      revDays = {}
      for i,v in ipairs(days) do
        revDays[v] = i
      end
    • break和return语句
      >Lua 语法要求 break 和 return 只能出现在 block 的结尾一句(也就是说:作为 chunk的最后一句,或者在 end 之前,或者 else 前,或者 until 前),例如
      local i = 1
      while a[i] do
          if a[i] == v then break end
          i = i + 1
      end

      有时候为了调试或者其他目的需要在 block 的中间使用 return 或者 break,可以显式的使用 do..end 来实现

      function foo ()
          return --<< 这是错误的!!!
          -- 'return' is the last statement in the next block
          do return end -- 应该这样使用
          ... -- statements not reached
      end


  • 相关阅读:
    perl 判断网站内容是否变更
    鸿雁电器oa系统中决策支持模块效果
    爬虫1-15
    自动封杀脚本
    图表中如何实现动态变更分类轴与系列值
    错误代码: 1305 PROCEDURE world.insert_data does not exist
    错误代码: 1054 Unknown column 't.createUsrId' in 'group statement'
    错误代码: 1247 Reference 'startTime' not supported (forward reference in item list)
    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Query was empty
    echarts中地图提示"TypeError:i is undefined"
  • 原文地址:https://www.cnblogs.com/jierism/p/6432876.html
Copyright © 2020-2023  润新知