• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua教程(四):函数详解

Lua教程(四):函数详解

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了lua源码详解与应用,lua 详解,lua随机函数,lua中尾调函数,lua 回调函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、函数:

    在Lua中函数的调用方式和C语言基本相同,如:print("Hello World")和a = add(x, y)。唯一的差别是,如果函数只有一个参数,并且该参数的类型为字符串常量或table的构造器,那么圆括号可以省略,如print "Hello World"和f {x = 20, y = 20}。
    Lua为面对对象式的调用也提供了一种特殊的语法--冒号操作符。表达式o.foo(o,x)的另一种写法是o:foo(x)。冒号操作符使调用o.foo时将o隐含的作为函数的第一个参数。
    Lua中函数的声明方式如下:
      function add(a)
        local sum = 0
        for i, v in ipairs(a) do
            sum = sum + v
        end
        return sum
    end
 </div>
    在以上声明中,包含了函数名(add),参数列表(a),以及函数体。需要说明的是,Lua中实参和形参的数量可以不一致,一旦出现这种情况,Lua的处理规则等同于多重赋值,即实参多于形参,多出的部分被忽略,如果相反,没有被初始化的形参的缺省值为nil。

    1. 多重返回值:

    Lua支持返回多个结果值。如:
s,e = string.find("Hello Lua users","Lua")
print("The begin index is " .. s .. ", the end index is " .. e .. ".");
-- The begin index is 7, the end index is 9.

    以上的代码示例只是演示了如何获取Lua函数的多个返回值,下面的示例将给出如何声明返回多个值的Lua函数。如:
[code]
function maximum(a)
    local mi = 1
    local m = a[mi]
    for i, val in ipairs(a) do
        if val > m then
            mi,m = i,val
        end
    end
    return m,mi
end
print(maximum{8,10,23,12,5})
--23   3
</div>

Lua会调整一个函数的返回值数量以适应不同的调用情况。若将函数调用作为一条单独语句时,Lua会丢弃函数的所有返回值。若将函数作为表达式的一部分来调用时,Lua只保留函数的第一个返回值。只有当一个函数调用是一系列表达式中的最后一个元素时,才能获得所有返回值。这里先给出三个样例函数,如:
    function foo0() end
    function foo1() return "a" end
    function foo2() return "a","b" end
</div>

 最后一个需要介绍的是Lua中unpack函数,该函数将接收数组作为参数,并从下标1开始返回该数组的所有元素。如:
      /> lua
    > print(unpack{10,20,30})
    10  20  30
    > a,b = unpack{10,20,30}
    > print(a,b)
    10  20
    > string.find(unpack{"hello","ll"})  --等同于string.find("hello","ll")
</div>
    在Lua中unpack函数是用C语言实现的。为了便于理解,下面给出在Lua中通过递归实现一样的效果,如:
function unpack(t,i)
    i = i or 1
     if t[i] then
         return t[i], unpack(t,i + 1)
     end
end
</div>

2. 变长参数:
    Lua中的函数可以接受不同数量的实参,其声明和使用方式如下:
   function add(...)
    local s = 0
    for i, v in ipairs{...} do
        s = s + v
    end
    return s
end
print(add(3,4,5,6,7))
--输出结果为:25
 </div>

  解释一下,函数声明中的(...)表示该函数可以接受不同数量的参数。当这个函数被调用时,所有的参数都被汇聚在一起,函数中访问它时,仍需用3个点(...)。但不同的是,此时这3个点将作为表达式来使用,如{...}表示一个由所有变参构成的数组。在含有变长参数的函数中个,同样可以带有固定参数,但是固定参数一定要在变长参数之前声明,如:
      function test(arg1,arg2,...)
        ...
    end
 </div>
    关于Lua的变长参数最后需要说明的是,由于变长参数中可能包含nil值,因此再使用类似获取table元素数量(#)的方式获取变参的数量就会出现问题。如果要想始终获得正确的参数数量,可以使用Lua提供的select函数,如:
for i = 1, select('#',...) do  --这里'#'值表示让select返回变参的数量(其中包括nil)。
    local arg = select(i, ...) --这里的i表示获取第i个变参,1为第一个。
     --do something
end
</div>

3. 具名实参:

    在函数调用时,Lua的传参规则和C语言相同,并不真正支持具名实参。但是我们可以通过table来模拟,比如:
      function rename(old,new)
        ...
    end
 </div>
    这里我们可以让上面的rename函数只接收一个参数,即table类型的参数,与此同时,该table对象将含有old和new两个key。如:
      function rename(arg)
        local old = arg.old
    &

您可能想查找下面的文章:

  • lua文件操作详解
  • 举例详解Lua中的协同程序编程
  • 详解Lua中的元表概念
  • 详解Lua中的数组概念知识
  • 详解Lua中if ... else语句的使用方法
  • 详解Lua中的if语句的使用方法
  • 详解Lua中的while循环语句的使用
  • 详解Lua中的数据类型
  • 详解Lua中的变量相关知识点
  • lua中赋值类型代码详解

相关文章

  • Lua中的数学库总结
  • C++中调用Lua配置文件和响应函数示例
  • Lua脚本语言基本语法快速入门教程
  • Lua中的运算符简明总结
  • Lua中执行系统命令方法介绍
  • Lua中创建全局变量的小技巧(禁止未预期的全局变量)
  • 浅谈Lua的面向对象特性
  • Lua编程示例(七):协同程序基础逻辑
  • Lua所有内置函数罗列
  • Lua中获取table长度问题探讨

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua中写排序算法实例(选择排序算法)
    • 编写高性能Lua代码的方法
    • Lua中的迭代器和泛型for学习总结
    • Ruby元编程技术详解(Ruby Metaprogramming techniques)
    • Lua中的闭包学习笔记
    • Lua中的__index方法详解
    • Lua性能优化技巧(二):基本事实
    • 举例简介Lua中函数的基本用法
    • Lua面向对象编程之类的简单实现方式
    • Lua判断一个目录或文件是否存在的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有