lua学习笔记之函数

Lua学习笔记之函数

1、  函数的作用

函数主要完成指定的任务,这样的情况下函数作为调用语句使用,函数可以计算并返回值,这样的情况下函数作为赋值语句的表达式使用。

语法:

funcationfunc_name(arguments-list)

Statements-list

end

调用函数的时候,如果参数列表为空,必须使用()表示是函数调用。

Print(8*9,9/8)

a = math.sin(3) +math.cos(10)

print(os.date())

上述规则有一个例外,当函数只有一个参数并且这个参数是字符串或者表构造的时候,()是可选的:

print “hello world”    <--> print(“hello world”)

dofile ‘a.lua’    <-->dofile(‘a.lua’)

lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足.

2、  返回多个结果值

Lua函数可以返回多个结果值,比如strng.find,其返回匹配串“开始和结束的下标”(如果不存在匹配串返回nil)

s,e = string.find(“hello lua users”,”lua”)

print(s,e)   -->7 9

lua函数中,在return后列出要返回的值得到列表即可返回多值,如:

function maximum(a)

local mi = 1

local m = a[mi]

for i,val inipairs(a) do

ifval >m then

mi = i

m = val

end

return m,mi

end

print(maxmun({8,10,23,12,5}))  -->23 3

3、  可变参数

Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(…)表示函数有可变的参数。Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表还有一个域n表示参数的个数。

4、  命名参数

Lua的函数参数是和位置相关的,调用时实参会按照顺序依次传递给形参。有时候用名字指定参数是很有用的,比如rename函数用来给一个文件重命名,有时候我们记不起命名前后两个参数的顺序:

rename(old = “temp.lua”,new = “temp1.lua”)

上面的代码是无效,lua可以通过将所有的参数放在一个表中,把表作为函数的唯一参数来实现上面这段伪代码的功能,因为lua语法支持函数调用时实参可以是表的构造。

Rename{old = “temp.lua”,new = “temp1.lua”}

根据这个想法我们重定义了rename:

functionrename(arg)

returnos.rename(arg.old,arg.new)

end

5、  闭包

当一个函数内部嵌套另一个函数定义时,内部的函数体可以访问外部的函数的局部变量,这个特种我们称为词法定界。虽然这个看起来很清楚,事实并非如此:

假如有一个学生姓名的列表和学生名和成绩对用的表:现在根据学习生的成绩从高到低对学生进行排序,可以这样做:

Names = {“peter”,”paul”,”mary”}

Grades = {mary =10,paul = 7,peter = 8}

Table.sort(Names,function(n1,n2))

ReturnGrades[n1]>Grades[n2]

end)

创建一个函数实现此功能

function sortbygrade (Names,Grades)

table.sort(Names,function(n1,n2))

returnGrades[n1]>Grades[n2]

end)

end

例子中包含在sortbygrade函数内部的sort中的匿名函数可以访问sortbygrade的参数Grades,在匿名函数内部Grades不是全局变量也不是局部变量,我们称为外部的局部变量。

看如下代码:

functionnewCounter()

locali = 0

returnfunction()    --匿名函数

i = i+1        --外部的局部变量

return i

end

end

c1 = newCounter()

print(c1())   --> 1

print(c1())   --> 2

匿名函数使用外部的局部变量保存它的计数,当我们调用匿名函数的时候i已经超出了作用范围,因为创建i的函数newCounter已经返回了,然后Lua用闭包的思想正确的处理了这样的情况。简单说闭包是一个函数加上它可以正确访问外部的局部变量。如果我们再次调用newCounter,将创建一个新的局部变量i,因此我们得到一个作用在新的变量i上的新闭包。

技术上说闭包指值而不是函数,函数仅仅是闭包的一个原形声明。

时间: 2024-10-24 17:33:11

lua学习笔记之函数的相关文章

Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组

1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 function func_no_p(...) local arg={...} for k,v in pairs(arg} do print(v ..",") end print("输入参数个数:".. #arg) end func_no_p(1,2,34,1,"

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样:

Lua学习笔记(五):函数

函数有两种用途: 1).完成指定的任务,这种情况下函数作为调用语句使用: 2).计算并返回值,这种情况下函数作为赋值语句表达式使用. 1 function func_name (arguments-list) 2 statements-list; 3 end; 4 5 --调用函数的时候,如果参数列表为空,必须使用()表明是函数调用 6 print(8*9, 9/8) 7 a = math.sin(3) + math.cos(10) 8 print(os.date()) 9 10 --上述规则有

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

lua学习笔记之基本语法

Lua学习笔记之基本语法 1.  赋值语句 赋值是改变一个变量的值和改变表域的最基本的方法. a = "hello".."world" t.n = t.n+1 lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会一次赋给左边的变量. a,b = 10,2*x    <-->a = 10;b = 2*x 遇到赋值语句lua会先计算右边所有的值然后再执行赋值操纵,所以我们可以这样进行交换变量的值: x,y = y,x    

Lua学习笔记(2) —— 风格

前一篇大概学习了lua常用的语法,都是些刚入门时应该了解的.见这里 Lua学习笔记(1) ——语法 这篇主要记录一些关于lua代码风格的经验,如果不了解它们,还是拿着函数式或传统面向对象的风格去写lua,就永远无法了解lua的精华之所在,弃之所长,取其所短. 1. 函数类型的变量 2. 匿名函数 3. 闭包 4. 表 5. 协程 6. 虚拟机

lua学习笔记之类型和值

Lua学习笔记之类型和值 1.全局变量 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil 如果需要删除一个全局变量,只需要将变量赋值为nil 2.词法约定 标识符:字母或者下划线开头的字母.下划线.数字序列,最好不要使用下划线家大写字母的标识符,因为lua的保留字也是这样的. 3.命令行方式 Lua[options][script[args]] -e:直接将命令传入lua Prompt>lua –e "print(

lua学习笔记(2)-常用调用

assert(loadstring("math.max(7,8,9)"))dofile("scripts/xxx.lua")math.floor()math.random()   math.random(10, 100)math.min(3,4,5) math.max(2,3,4)num = tonumber(str)str = tostring(num)len = string.len(str)str = string.sbu (str, start_positi

Lua学习笔记(八):数据结构

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays.records.lists.queues.sets等,Lua都是通过table来实现,并且在Lua中table很好的实现了这些数据结构. 1.数组 在Lua中通过整数下标访问table中元素,既是数组,并且数组大小不固定,可动态增长.通常我们初始化数组时,就间接地定义了数组的大小,例如: 1 a = {} -- new array 2 for i=1, 1000 do 3 a[i] = 0 4 end 5 6 --数