Lua中的函数精讲笔记

 更新时间:2015年04月23日 10:47:13   投稿:junjie  
这篇文章主要介绍了Lua中的函数精讲笔记,本文讲解了函数的用途、可变参数函数、闭包、非全局函数等内容,需要的朋友可以参考下

函数的用途:

1.完成指定的任务,这种情况下作为调用语句使用。
2.计算并返回值,这种情况下,函数作为赋值语句的表达式使用。

函数的参数为空,必须使用()表示函数调用。例外:当函数只有一个参数,并且这个参数是字符串或表构造时,()是可选的。
lua提供了面向对象调用函数的语法
o:foo(x)与o.f(o,x)是等价的。

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

lua函数可以返回多个值,return后列出要返回值的列表即可返回多值

复制代码 代码如下:

s, e = string.find("hello lua", "lua")

那么,lua是如何调整函数返回值的个数来适应调用环境的呢?
1. use as statement,所以返回值被忽略。
2. use as expression

1).当作为表达式最后一个参数或仅有的一个参数时,根据变量个数,函数尽可能多地返回多个值,不足补nil,超出舍去。
2).其他情况函数调用返回第一个值(如果无返回值为nil)
3).函数调用作为函数参数被调用时,和多值赋值相同
4).函数调用在表构造中初始化时,和多值赋值相同
5).return f(); f()返回所有值。可以使用括号强制返回一个值return (f())

c语言中,可以使用函数指针来调用可变的函数,可以声明参数可变的函数,但不能两者同时可变。

Lua可以这样来调用可变参数的可变函数:f(unpack(a))

unpack接受一个数组作为输入参数,返回数组所有的元素。注意是数字,返回ipair遍历结果

复制代码 代码如下:

f = string.find
a = {"hello lua", "lua"}
print(f(unpack(a)))

可变参数使用...表示,Lua将可变参数放在arg的表中,含有一个域n表示参数的个数
(5.1+:用...取代了arg。如:

复制代码 代码如下:

function printArgLen(...)
print(select("#", ...))
end
)

function select(n, ...)
     return arg[n]
end


给函数参数命名:可以把表作为函数的唯一参数来实现命名参数的功能。
复制代码 代码如下:

rename {old="temp.lua", new="temp1.lua"}
function rename(arg)
     os.rename(arg.old, arg.new)
end

当参数比较多,或容易混淆时,可以采用命名参数。


Lua中的函数带有词法定界的第一类值。

第一类值: 在Lua中,函数和其他值(数值,字符串)一样,函数可以被存放在变量中,也存放在表中, 可以作为函数的参数,还可以作为函数的返回值。
词法定界:被嵌套的函数可以访问他外部函数的变量。

lua的函数也可以是匿名的,当我们提到函数名时,实际上是说一个指向函数的变量。

闭包

词法界定加上第一类函数是一个功能强大的概念。

复制代码 代码如下:

function sortbygrade(names, grades)
     table.sort(names, function(n1,n2)
          return grades[n1]>grades[n2]
     end)
end

在匿名函数内部grades称为是外部的局部变量或upvalue

闭包在上下文环境中提供很有用的功能。可作为高级函数的参数,可作为函数嵌套的函数(比如返回一个闭包),可以作为回调函数。利用闭包可以重新定义某个函数,当别人调用某个函数时,调用到自己定义的做了安全检查的函数,从而创建了一个安全的环境(沙箱)

复制代码 代码如下:

do
     local oldopen = io.open
     io.open = function(f,m)
          if access_ok(f,m) then
               return oldopen(f,m)
          else
               return nil, "access denied"
          end
     end
end

非全局函数

函数作为table的域(大部分lua库函数使用这种机制实现的。如io.read,math.sin)
有3种语法方式:
1.

复制代码 代码如下:

lib = {}
lib.foo = function(x,y) return x+y end

2.
复制代码 代码如下:

lib = {foo = function(x,y)return x+y end}

3.
复制代码 代码如下:

lib = {}
function lib.foo(x,y)
     return x+y
end

(完)

相关文章

  • Lua源码中字符串类型的实现

    Lua源码中字符串类型的实现

    与其他主流脚本语言不同的是,Lua在实现字符串类型有两方面不同。第一,所有的字符串在Lua中都只储存一份拷贝。第二,所有的字符串变量,只保存字符串引用,而不保存它的buffer。我们来具体看看lua源码中如何实现字符串类型的吧
    2015-04-04
  • Redis教程(三):List数据类型

    Redis教程(三):List数据类型

    这篇文章主要介绍了Redis教程(三):List数据类型,本文讲解了List数据类型概述、相关命令列表、命令示例、链表结构的小技巧等内容,需要的朋友可以参考下
    2015-04-04
  • Lua中的模块(module)和包(package)详解

    Lua中的模块(module)和包(package)详解

    这篇文章主要介绍了Lua中的模块(module)和包(package)详解,本文讲解了require函数、写一个模块、package.loaded、module函数等内容,需要的朋友可以参考下
    2014-09-09
  • 详解Lua中if ... else语句的使用方法

    详解Lua中if ... else语句的使用方法

    这篇文章主要介绍了详解Lua中if ... else语句的使用方法,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua中的基本语法、控制语句总结

    Lua中的基本语法、控制语句总结

    这篇文章主要介绍了Lua中的基本语法、控制语句总结,本文总结了赋值、局部变量与块、控制结构、数字型for、泛型for等内容,需要的朋友可以参考下
    2014-09-09
  • Lua判断一个目录或文件是否存在的方法

    Lua判断一个目录或文件是否存在的方法

    这篇文章主要介绍了Lua判断一个目录或文件是否存在的方法,Lua中可以使用io.open判断文件或目录是否存在,本文总结了判断方法,并给出了一个自定义函数,需要的朋友可以参考下
    2015-04-04
  • Lua中的函数写法简明示例

    Lua中的函数写法简明示例

    这篇文章主要介绍了Lua中的函数写法简明示例,本文是一篇个人学习笔记,简单的记录了Lua函数的写法,需要的朋友可以参考下
    2015-04-04
  • lua闭包的理解以及表与函数的几种表达方法

    lua闭包的理解以及表与函数的几种表达方法

    本文首先通过具体的例子讲解了Lua中闭包的概念,然后总结了闭包的应用场合,最后探讨了Lua中闭包的实现原理,以及lua中表与函数的3种表达方式的汇总
    2015-08-08
  • Lua中使用table实现的其它5种数据结构

    Lua中使用table实现的其它5种数据结构

    这篇文章主要介绍了Lua中使用table实现的其它5种数据结构,本文用table为基础,实现了数组、链表、队列、集合等数据类型,需要的朋友可以参考下
    2014-09-09
  • Lua学习笔记之表和函数

    Lua学习笔记之表和函数

    这篇文章主要介绍了Lua学习笔记之表和函数,本文在代码中使用大量注释讲解了Lua的表和函数的使用,需要的朋友可以参考下
    2014-09-09

最新评论