L1[function]01. 定义与调用函数

函数的定义 和概念 没什么可说的

lua的函数声明和调用是有先后顺序的  先声明后调用

函数就是变量的一种 所以可以自由的把函数在变量间相互赋值 不过注意函数变量和表变量差不多 都是存储的是内存地址 指针

aa=function (x,y)—红色部分就是所谓的lua的匿名函数 但是真的名不副实
     print(x,y)

end

aa(1,2
)

L1[function]02. 作用域与返回值

L1[function]03. 多个返回值

function test(x,y,z)
     return x+1,y+1,z+1--懒得说

end

a,b,c=test(1,2,3)

print(a,b,c)

小知识:return在函数内得一点注意事项 return在函数内 一般都是函数代码得最后一行(空行 end之类自然不算) 如果强行在return语句后面加上其他代码 很大可能会导致报错

function test(x,y,z)
return x+1,y+1,z+1
print("1")--直接报错 D:\Program Files (x86)\zerobrane\bin\lua53.exe: E:\lua\test15.lua:3: 'end' expected (to close 'function' at line 1) near 'print'
end
a,b,c=test(1,2,3)
print(a,b,c)

但是 有些代码写在return后面没事 不过就几个 else  elseif end    ..

function test1(a,b)

    if (a>b) then
return "大于"
elseif (a==b) then
return "等于"
else
--肯定是a<b
return "小于"
end
end

L1[function]04. 参数的传递

函数得参数就是函数得局部变量

注意 如果函数的参数 传递的不是普通变量  而是对象  常见的对象比如table类型  表变量里面存储的其实只是一个指针 作为函数参数传递的也是一个指针地址   参数为对象 在函数内部对这个对象的指针进行一系列操作 可不是想数值 字符串那样 对外面的这个变量没影响

--这个函数只是把传递进来的表第一个元素变为100
function test2(a)
if (type(a)=="table") then
a[1]=100
else
print("not table")
end
end
xx={1,2,3,4,5}--创建表赋初值
for v,k in pairs(xx) do--遍历出表的初值
print(v,k)
end
print("=================")
test2(xx) --把xx表变量传递进来进行处理
for v,k in pairs(xx) do--再次看下 表变量的变化
print(v,k)
end
--结果就是如果参数为对象 那么函数在内部处理该对象也很有可能影响到该对象在外部的内容

结果

1    1

2    2

3    3

4    4

5    5

=================

1    100

2    2

3    3

4    4

5    5

程序于 0.20 秒完成 (pid: 16008).

小知识:lua的闭包理解

https://www.cnblogs.com/zzy-frisrtblog/p/5864209.html

小知识:upvalue其实可以理解为c下的静态局部变量

静态局部变量的常见特点

1.函数体内如果在定义静态变量的同时进行了初始化,则以后程序不再进行初始化操作

2.auto自动变量会随着函数被调用和退出而存在和消失,而static类局部变量不会消失 。它不管其所在的函数是否被调用,都将一直存在;不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。换言之,Static类型的内部变量是一种只能在某个特定函数中使用,但一直占据存储空间的变量

L1[function]05. 可选参数

小知识 可变参数 没什么说的 参数数量不确定的时候的选择 …   但是又一些特殊情况 比如参数里面夹杂了值nil 那么遍历所有参数会出现问题

function test(...)
--接受参数汇总成1个表
local tempTable=table.pack(...) --遍历参数表
if (type(tempTable)=="table") then
for v,k in pairs(tempTable) do
print(k)
end
else
print("not table")
end
end
test(1,2,3,4,5,6,7,8,9,0)

特殊情况 比如参数里面夹杂了值nil 那么遍历所有参数会出现问题 为了避免这个情况  可变参数的函数基本结构应该如此

function test(...)
--接受参数汇总成1个表
local tempTable=table.pack(...)
print(tempTable.n)--这个n属性是table.pack的自带属性 是包含了表内所有元素个数 就算是表元素有很多nil干扰 它依然可以获取元素个数 --遍历参数表
if (type(tempTable)=="table") then
--下面这种遍历只能正确的输出value ,key无法保证
for i=1,tempTable.n do
print(tempTable[i])
end
else
print("not table")
end
end
test(1,2,nil,4,5,nil,nil,8,9,0)

结果

1

2

nil

4

5

nil

nil

8

9

0

可变参数还可以和固定参数混搭  不过固定参数必须要在前面 可变参数垫底

function test(a,b,c,…)

小知识:调用函数的时候 规定多少参数一定要一一对应 不能不写 易语言下 似乎可以空出来 但是lua下必须一一对应 不行就在对应位置加个nil也行 不会报错

function test1(a,b,c)
print(a,b,c)
end
test1(1,,3)--报错D:\Program Files (x86)\zerobrane\bin\lua53.exe: E:\lua\test18.lua:21: unexpected symbol near ','
test1(1,nil,3)

123

小知识:函数默认值的写法 参数为nil我们就赋一个初值给它即可 但是注意参数内容为false的时候默认值出错

function test1(a,b,c)
--设置默认值 懒得说
a=a or 1
b=b or 2
c=c or 3 print(a,b,c)
end
test1(2,nil,4)

结果

2    2    4

当然 传递进来的参数内容不能是false  这样默认值会选择错误的值 不过一般情况下 不会出现

function test1(a,b,c)
a=a or 1
b=b or 2
c=c or 3 print(a,b,c)
end
test1(false,nil,4)--结果1 2 4 但是我第一个参数命名是传递的false这个布尔值 却返回1个数值1

123

L1[function]06. 可变长参数

L1[function]07. 按键插件函数例子

小知识:按键插件的lua的写法。很简单  就是函数写法有点要求 其他没什么

function QMPlugin.test()

end

[lua]紫猫lua教程-命令宝典-L1-01-10. 自定义函数的更多相关文章

  1. [lua]紫猫lua教程-命令宝典-L1-01-03. 数值数据

    lua5.3在线手册地址  https://cloudwu.github.io/lua53doc/contents.html#contents 其实我们直接啃手册就够了 推荐如果有基础的先啃手册再看紫 ...

  2. [lua]紫猫lua教程-命令宝典-L1-01-02. 变量

    L1[变量]01. 变量命名规则 命名规则:数字字母下划线构成 但是不能数字开头 不推荐中文名 很多都是不支持中文 但是在一些其他的编辑器里面 比如触摸精灵 之类的 就可以 注意 :变量命名必须要包含 ...

  3. [lua]紫猫lua教程-命令宝典-L1-01-01. Lua环境与IDE

    网上大把的lua教程  不过紫猫老师的教程向来都是讲的非常仔细 所以最近天气已经36+了 魔兽世界还需要冲飞行声望  懒得写单子根本没有单子,正好认认真真的看下紫猫老师的lua教程 紫猫老师的lua教 ...

  4. [lua]紫猫lua教程-命令宝典-L1-01-04. 字符串数据

    L1[字符串]01. 单引号与双引号 没什么说得 字符串:以双引号包含 或者单引号包含 或者[[]]包含 L1[字符串]02. 长文本内容 小知识:如果用[[]]包含字符串内容 但是字符串内容里面 包 ...

  5. [lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库

    L1[string]01. ASCII码互转 小知识:字符串处理的几个共同的几点 1.字符串处理函数 字符串索引可以为负数 表示从字符串末尾开始算起 所有字符串处理函数的 字符串索引参数都使用 2.所 ...

  6. [lua]紫猫lua教程-命令宝典-L1-01-07. table表

    L1[table]01. table表的定义与赋值 小知识:声明表的例子 xx={}--创建一个空表xx --给这表的元素赋值 test="a" xx[test]="a& ...

  7. [lua]紫猫lua教程-命令宝典-L1-01-11. lua的个人补充

    1.关于三目运算符的一些补充和纠正 前面没看仔细  a>b ? a: b 这个形式 似乎lua下并不存在...要了命 一般都是使用  a and b or c 的形式 但是这种形式存在一些问题 ...

  8. [lua]紫猫lua教程-命令宝典-L1-03-01. 闭包

    L1[闭包]01. 函数的传递赋值 没什么说的 1.函数作为变量来看 可以轻松的声明 相互赋值 2.函数变量本质是 一个内存指针 所以函数变量的相互赋值不是传递的函数本身 而是指向这个函数的内存地址 ...

  9. [lua]紫猫lua教程-命令宝典-L1-01-08. math数学函数库

    L1[math]01. 取绝对值 L1[math]02. 三角函数 小知识:注意 lua下三角函数用的参数是弧度 而不是角度 弧度=角度*pi/180  -->弧度角度换算公式  lua的mat ...

随机推荐

  1. P4883 mzf的考验[平衡树]

    P4883 mzf的考验 维护一种数据结构 支持区间翻转 区间异或 区间求和- 显然 fhq treap 区间异或显然是拆位 ~~然后复杂度*20~~ 第一次先遍历一下整棵树 pushup 一下 就可 ...

  2. 树莓派3B从装系统到安装RYU过程

    1.首先安装的是2019-09-26-raspbian-buster-lite系统 2.更换成国内源 更改apt源 sudo nano /etc/apt/sources.list(更改apt源) de ...

  3. 服务&软件&基础设施的区别

    IT基础设施: 软件 硬件 数据库相关DBM 网络相关 networking(网络通信) 以上4个会出现的比较多 application people 上面的东西都能提供IT服务 一半的互联网公司都会 ...

  4. window.location.herf传值问题

    各个值之间用&&&&&&连接 新版本的tomcat不支持其他字符,需要通过encodeURIComponent编码 变量名数字后不能直接加字母 such ...

  5. 02-SV数据类型

    1.数据类型 内建数据类型:逻辑(logic)类型.双状态数据类型(bit,byte,shortint,int,longint).四状态数据类型(integer,time,real) 其他:定宽数组. ...

  6. 将字符串转换为double类型的list

    var data=“3.039,3.977,3.677,5.855,12.341,6.771”; 方法一: var result=datas.Split(',').ToList().ConvertAl ...

  7. ECMAScript基本语法——③数据类型

    Java内有两种 基本数据类型:4类八种 引用数据类型:对象 JavaScript也有两种 原始数据类型 其实是基本数据类型 number:数字.整数.小数.NaN(特殊的数字,not a numbe ...

  8. 2019-08-17 纪中NOIP模拟B组

    T1 [JZOJ3503] 粉刷 题目描述 鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个N*M的矩阵,有一些格子是有污点的.现在鸡腿可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次, ...

  9. WPF 解决无边框产生的相关问题

    原文:WPF 解决无边框产生的相关问题 最大化: 在设置WindowStyle="None" AllowsTransparency="True"后,最大化会覆盖 ...

  10. php设计模式之适配器模式实例代码

    <?php header("Content-type:text/html;charset=utf-8"); // 适配器模式 /** * 查看天气接口 */ class Ti ...