LUA 函数与多重赋值

函数声明与调用

函数声明格式

function name ()

  something

  return

end

等价

name = function ()

  something

  return

end

函数调用需要在函数名后加括号(),但有一种例外:当函数只有一个参数且参数是字符串或者表时可以不用加括号

print "Hello" 等价 print ("Hello")

 

多重赋值规则

当变量列表多于值列表时:a, b, c = 1, 2

会以nil补充值列表

当变量列表少于值列表时:a, b = 1, 2, 3

会丢弃多余的值列表

 

多重赋值嵌套

当拥有多值的对象是多重赋值中唯一或最后一个参数时

假设f()返回两个值1,2

a, b, c = f() --> a, b, c = 1, 2, nil

a, b, c = 1, f() --> a, b, c = 1, 1, 2

函数会展开所有返回值与变量列表按顺序进行多重赋值

当拥有多值的对象不是多重赋值中唯一或最后一个参数时

a, b, c = f(), 2, 3 --> a, b, c = 1, 2, 3

a, b, c = 1, f(), 3 --> a, b, c = 1, 1, 3

函数只会取第一个返回值与变量列表按顺序进行多重赋值

如果给拥有多值的对象加上括号()就可以强制其只使用第一个返回值进行操作

a, b, c = (f()) --> 1, nil, nil

 

利用多重赋值交换变量

a, b = b, a

 

多重赋值机制适用的其他场景

函数嵌套:print ( f ()) print函数会接收两个f函数的返回值作为参数,同样也适用多重赋值机制,如:print (1, f()) / print ((f()) / print (f(), 1)

表嵌套:t = {f()} f函数会在表中展开多返回值,同样也适用多重赋值机制,如:t = {1,f()} / t = {(f())} / t = {f(), 1}

 

函数可变参

可变参表达式 ... 三个点,他可以表示所有传入的实参列表。该表达式一样可以参与多重赋值,表初始化,函数调用,同样适用多重赋值机制。

function a (...)

  return ...

end

该函数将返回所有传入的参数

 

遍历可变参:select (index, ...)

返回指定位置的参数

参数index:指定位置,当参数为"#"时,返回参数列表的个数。参数...:参数列表

select (1, "a", "b", "c") --> a b c

select (2, "a", "b", "c") --> b c

select ("#", "a", "b", "c") --> 3

 

function add (...)             -- 数组可变参求和

  local s=0

  for i=1, select ("#", ...) do -- 根据可变参数量循环

    s=s+select (i, ...)       -- 逐一将每个参数相加
  end

  return s                 -- 返回求和总数

end

 

posted @ 2022-01-11 14:46  黑姆豆  阅读(364)  评论(0)    收藏  举报