Lua学习笔记之表和函数_Lua

Lua中的表和函数比较重要,正是因为二者的结合才完成了很多很多的功能,Lua才变得如此的强大,所以有必要仔细的学习一下表和函数。如下的代码体现了表的用法。

--表
--可以使用构造器来初始化表,表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。
local days = {"xiao", "ta", "hello", "lua"}
--第一个元素索引为1,以后的类推,这一点和其他语言的第一个元素索引是0不同
print(days[4])    --> lua

--构造函数可以使用任何表达式初始化
local num = {1,2,3,4,5}
--其实num的初始化等价于如下
local num = {[1]=1,[2]=2,[3]=3,[4]=4,[5]=5}
--访问元素的时候使用中括号
print(num[1]) -->1

--还可以在初始化表的时候为元素提供一个索引
local tab = {a=1,b=2}
--等价于如下的初始化
local tab = {["a"]=1,["b"]=2}
print(tab["a"]) -->1
--当索引值是字符串的时候可以使用tab.a的形式来访问元素,其实代表的就是tab["a"]
print(tab.a) -->1
--注意区分tab["a"]和tab[a]这俩种形式,第一种代表的索引是字符串a,可以使用等价的形式tab.a来访问它的值
--第二种代表的是使用a这个变量的值作为索引来访问
local a = "haha"
local tab2 = {a="hello",[a]="lua"}
print(tab2.a) -->hello
print(tab2[a]) -->lua

--向表中添加元素
tab2.x = 3
tab2[5] = 4
--删除元素
tab2.a = nil

--一个表中可以混合各种类型的值,可以是boolean,字符串,表,函数,等等
local tab3 = {color="blue",{x=0,  y=0},thickness=2, npoints=false,
       {x=-10, y=0},
       {x=-30, y=1},
       {x=0,  y=1}
}
--没有添加索引的时候索引默认从1开始
print(tab3[2].x)   --> -10

--在构造函数的最后的","是可选的,可以方便以后的扩展
local a = {[1]="red", [2]="green", [3]="blue",}
--在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素
local tab4 = {x=10, y=45; "one", "two", "three"}

接下来学习Lua函数的用法,函数涉及的东西比较多,不着急,慢慢来。

--函数
--如下是基本的函数的写法 local代表函数a是局部变量,接下来的function当然是函数的说明符了,a是函数的名称
--括号中写参数,最后的end代表函数的结束 中间的函数体当然是我们要完成的函数功能了
local function a()
  print("function")
end
--等价于如下的写法,前面已经说过函数是第一类值,所以就是把函数赋值给一个变量,然后调用这个变量
local a = function()
  print("function")
end
--函数的调用
a()
--我们也可以将函数作为一个表的数据成员
local tab = {1}
--函数的前边不需要local的修饰符,因为这个函数就是这个表里边的一个数据,只能用这个表来访问
tab.func = function()
  print("tab.func")
end
--或者可以简写为
function tab.func()
  print("tab.func")
end
tab.func()

--还有一种写法,这里使用的是冒号,代表的是传递给func一个默认的参数self,这个参数的值就是tab
function tab:func()
  print(self[1]) -->1
end
--调用的时候使用冒号的形式来调用,代表的是默认传递一个值到这个函数中,这个值就是tab
tab:func()

--Lua的函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...)表示函数有可变的参数。
--Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。
local function func3(...)
  print(arg.n)
end
--在控制台下可以正常输出3,但是在IDE中这里说arg是个空值,不知道哪里设置的不对
--func3(1,2,3)

--下面是cocos中cclog函数的实现
local cclog = function(...)
  print(string.format(...))
end

--固定参数加可变参数
local function func4(a,b,...)
end

--多返回值
--Lua函数可以返回多个结果值,比如string.find,其返回匹配串“开始和结束的下标”(如果不存在匹配串返回nil)
--接收多返回值的时候采用如下的方式进行接收
local s, e = string.find("hello Lua users", "Lua")
print(s, e)    --> 7 9

--下面是多返回值的写法
local function func4(a,b)
  return a,b
end
print(func4(1,2)) -->1,2

--当作为表达式调用函数时,有以下几种情况:
--1. 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
--2. 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
--说的有点模糊,具体看例子
local function foo0 () end          -- returns no results
local function foo1 () return 'a' end    -- returns 1 result
local function foo2 () return 'a','b' end  -- returns 2 results
--返回值的个数不够的情况下补nil
local x,y = foo0()       -- x=nil, y=nil
local x,y = foo1()       -- x='a', y=nil
local x,y,z = foo2()      -- x='a', y='b', z=nil
print(foo0())      -->
print(foo1())      --> a
print(foo2())      --> a  b
--不是作为表达式的最后一个参数,这个时候只返回第一个值
print(foo2(), 1)     --> a  1
print(foo2() .. "x")   --> ax
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4

--可以使用圆括号强制使调用返回一个值
print((foo0()))   --> nil
print((foo1()))   --> a
print((foo2()))   --> a
--一个return语句如果使用圆括号将返回值括起来也将导致返回一个值

--命名参数 在cocos中,有时候我们需要给一个sprite设置位置,我们想将某个值赋给x,另一个值赋给y
--以下就是这种函数调用,但是结果是做不到的,实现这种思想的方法是通过表来实现,这个就叫命名参数,Cocos中有很多
--务必理解
--setPosition(x=1,y=2)

local function setPostion(point)
  print(point.x,point.y)
end

setPostion({x=1,y=2})

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, lua

,以便于您获取更多的相关知识。

时间: 2024-10-25 00:01:05

Lua学习笔记之表和函数_Lua的相关文章

Lua学习笔记之类型与值_Lua

基础介绍 Lua是一种动态类型的语言.在语言中没有类型定义的语法,每个值都带有其自身的类型信息.在Lua中有8种基本类型,分别是: nil(空)类型 boolean(布尔)类型 number(数字)类型 string(字符串)类型 userdata(自定义类型) function(函数)类型 thread(线程)类型 table(表)类型 以上是Lua中的8中基本类型,我们可以使用type函数,判断一个值得类型,type函数返回一个对应类型的字符串描述.例如: local iValue = 10

Lua学习笔记之运算符和表达式_Lua

本篇博客学习一下Lua的运算符,比较简单,我将说明直接写到了代码中,代码如下. --算术运算符 --二元运算符:+ - * / ^ (加减乘除幂) --一元运算符:- (负值) --这些运算符的操作数都是实数,Lua中没有自增自减的运算符. --关系运算符 -- < > <= >= == ~= --这里需要注意的是不等于是用~=表示的 --这些操作符返回结果为false或者true:==和~=比较两个值,如果两个值类型不同,Lua认为两者不同: --nil只和自己相等.Lua通过引

Lua学习笔记之函数、变长参数、closure(闭包)、select等_Lua

1. Lua函数支持多返回值,但并不是每次调用函数返回的全部值都会被使用. 有一条规则是只有当函数调用是表达式最后一个元素时,才会使用它的全部返回值.看代码: 复制代码 代码如下: --string.find函数返回两个值,:被查找子串的开始索引和结束索引  s,e = string.find("Lua program language","Lua")  print(s,e)  --> 1    3    --如果找不到,则输出nil和nil  s,e = s

Lua学习笔记之数据类型_Lua

从本篇博客开始研究一下Lua,现在的Lua真得是很火,因为Cocos2d-x写游戏的时候会用到,所以就拿过来学学吧,先从基础的语法开始,然后慢慢的深入.本人也是刚刚学习,希望和学习Lua的大家交流,博客权当笔记,有错误之处还请赐教. 当然首先是开发环境了,我的学习背景是Cocos2d-x,所以下载了最近发布的Cocos Code IDE版本,我们可以在Cocos Code IDE上边新建工程,然后写Lua测试代码,关于Cocos Code IDE的使用官方有不少的教程,这里就不说了.当然你也可以

Lua 学习笔记之C API 遍历 Table实现代码_Lua

Lua 通过一个虚拟栈与 C 的交互,正数索引自底向上取值,负数索引自顶向下取值. Lua 中的 Table(表)结构可以使用任何数据作为 key 进行取值.使用 C API 访问 Table 中的元素有两种方法: 复制代码 代码如下: lua_getglobal(L, t); lua_pushinteger(L, k); -- 这里可以换成其它类型的 lua_pushXXXX(L, k) 压数据到栈顶作key lua_gettable(L, -2); lua_getglobal(L, t);

Lua学习笔记之数据结构_Lua

最近研究Lua,顺便写点笔记吧!数据结构是没有语言之分的,只不过不同的语言实现起来的语法不同,既然是Lua菜鸟,就来实现几个常用的数据结构来练练语法吧!首先是作为数据结构基石的数组,在Lua中数组是用表来实现的,表是个强大的东西,能表示太多东西了,当表中元素的下标都是整数的时候,我们把这个表称作数组.数组的大小不固定,可以动态的增长. 复制代码 代码如下: --创建一个简单的数组 local arr1 = {1,2,3,4,5,6} --遍历数组中得每一个元素 for i,v in ipairs

Symfony2框架学习笔记之表单用法详解_php实例

本文实例讲述了Symfony2框架表单用法.分享给大家供大家参考,具体如下: 对于一个Web开发者来说,处理HTML表单是一个最为普通又具挑战的任务.Symfony2集成了一个Form组件,让处理表单变的容易起来.在这一节里,我们将 从基础开始创建一个复杂的表单,学习表单类库中最重要的内容. Symfony2 的Form组件是一个独立的类库,你可以在Symfony2项目之外使用它. 创建一个简单的表单: 假设你要创建一个应用程序的todo列表,需要显示一些任务.因为你的用户需要编辑和创建任务,所

SQL2005 学习笔记 公用表表达式(CTE)_mssql2005

公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集. CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效. 与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次. CTE可用于: 1.创建递归查询(我个人认为CTE最好用的地方) 2.在同一语句中多次引用生成的表 CTE优点: 使用 CTE 可以获得提高可读性和轻松维护复杂查询的优点. 查询可以分为单独块.简

HBase学习笔记——高表与宽表的选择

hbase中的宽表是指很多列较少行,即列多行少的表,一行中的数据量较大,行数少:高表是指很多行较少列,即行多列少,一行中的数据量较少,行数大. hbase的row key是分布式的索引,也是分片的依据. hbase的row key + column family + column qualifier + timestamp + value 是HFile中数据排列依据.HFile据此,对数据的索引到data block级别,而不是行级别.所以这种key是HFile内部的粗粒度(data block