• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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中的string库(字符串函数库)总结
    • Lua中让回调函数支持回调对象方法的解决方法
    上一篇:Lua中写排序算法实例(选择排序算法)
    下一篇:Lua中数字for循环实例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Lua中的函数精讲笔记 Lua,中的,函数,精讲,笔记,