lua基础

1、if代码块

x = 10
if x > 0 then
    print("x")
elseif x = 0 then
    print("x")
else
    print("x is a non-positive number")
end

2、while代码块,lua没有提供do-while结构

x = 1
sum = 0

while x <= 5 do
    sum = sum + x
    x = x + 1
end
print(sum)  -->output 15

3、repeat代码块,until的条件为真时结束,这一点与其它语言有所区别

--死循环
x = 10
repeat
    print(x)
until false

4、for循环

数字for(numeric for),第三个表达式step是可选的,表示增幅,默认为1

for i=1,10,2 do
  print(i)
end

-- output:
1
3
5
7
9

范型for(generic for)循环通过一个迭代器(iterator)函数来遍历所有值:

-- 打印数组a的所有值
local a = {"a", "b", "c", "d"}
for i, v in ipairs(a) do
  print("index:", i, " value:", v)
end

-- output:
index:  1  value: a
index:  2  value: b
index:  3  value: c
index:  4  value: d

标准库提供了几种迭代器,包括用于迭代文件中每行的(io.lines)、迭代table元素的(pairs)、迭代数组元素的(ipairs)、迭代字符串中单词的(string.gmatch)等。

5、break和return关键字

break用在循环体中,用于跳出当前循环体,继续执行后面的代码

return用于从函数中返回结果,后面的代码都不会执行。

6、函数

在调用函数的时候,若形参个数和实参个数不同时,Lua会自动调整实参个数。调整规则:若实参个数大于形参个数,多余的实参被忽略;若实参个数小于形参个数,没有被实参初始化的形参会被初始化为nil。

function fun1(a, b)  --两个形参,多余的实参被忽略掉
   print(a, b)
end

function fun2(a, b, c, d) --四个形参,没有被实参初始化的形参,用nil初始化
   print(a, b, c, d)
end

local x = 1
local y = 2
local z = 3

fun1(x, y, z)  -- z被函数fun1忽略掉了,参数变成 x, y

fun2(x, y, z)  -- 后面自动加上一个nil,参数变成 x, y, z, nil

-->output
1   2
1   2   3   nil

函数有两种表现形式

function add1(param1, param2)
    return param1 + param2
end

local add2 = function(param1, param2)
    return param1 + param2
end

add1(1, 2)
add2(1, 2)

add1方法是一个全局函数,如果需要定义成局部的,需要在function前面加local定义

add2是将一个方法赋值给一个局部变量add2

两种形式都可以,我比较喜欢第二种,显示的定义局部函数,具有较好的阅读性。

7、函数变长参数

变长参数,lua支持变长参数,形参为...

function func(...)  --形参为 ... ,表示函数采用变长参数

   local temp = {...}   --访问的时候也要使用 ...
   local ans = table.concat(temp, " ")  --使用table.concat库函数,对数组内容使用" "拼接成字符串。
   print(ans)
end

func(1, 2)      --传递了两个参数
func(1, 2, 3, 4)  --传递了四个参数

-->output
1 2

1 2 3 4

变长参数在lua5.2版本中做了一次升级

在lua5.1中,变长参数...默认会创建一个临时表arg,并且拥有一个全局属性n,通过arg.n获取可变参数的长度

local function test( ... )  
      num = arg.n  
      return num   
end  

由于可变参数创建的临时表会影响性能,在5.2版本中需要我们自己定义一个arg  table,而且删除了arg.n这种直接得到可变参数个数的方法

local function test( ... )  
      arg = { ... }    --这里的...和{}符号中间需要有空格号,否则会出错  
      local count = 0  
      for k,v in pairs(arg) do  
          count = count + 1  
      end  
      return count  
end  

通过select方法获取可变参数中的指定位置的参数

句法:select(selector, ...)

select(“#”, ...):获取可变参数的长度

select(n, ...):截取第n个参数到结尾的列表

local arg = select(n, ...):可以取到第n个参数,后面的列表都被舍弃了

function foo(...)  
    for i = 1, select('#', ...) do  --get the count of the params  
        local arg = select(i, ...); --select the param  
        print("arg", arg);  
    end  
end  
  
foo(1, 2, 3, 4)

--output
arg 1
arg 2
arg 3
arg 4

8、回调函数

将回调函数作为参数,传入其它方法中。

local m = {}  
  
local list = {name="hello",age=12}  
m.call_back_fun_print = function(printID)  
    print(printID .. "-->" .. list[printID])  
end  
  
m.add_list = function(key,value,call_back_fun)  
    key = tostring(key)  
    list[key] = value  
    call_back_fun(key)  
end  
m.add_list("address","beijing",m.call_back_fun_print) --address-->beijing  
  
return m  

 

posted @ 2017-11-03 13:58  大明湖畔的守望者  阅读(192)  评论(0编辑  收藏  举报