LUA函数之一

函数声明:

function foo(arguments)

  statements

end

1、函数调用

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

os.date()

当函数只有一个参数并且这个参数是字符串或者table构造器的时候,可以省略函数调用操作符"()",例如:

print "Hello World"

dofile "a.lua"

f{x=,y=}

面向对象方式调用函数的语法,例如:

obj::foo(x)
obj.foo(obj, x)

实参和形参结合时,多余部分被忽略,不足补充nil,例如:

function f(a,b) return a or b end

f()          -- a=3, b=nil
f(,)    -- a=3, b=4
f(,,)    -- a=3, b=4, 5 is discarded

2、多返回值

假设有3个函数:

function foo0() end
function foo1() return 'a' end
function foo2() return 'a', 'b' end

如果只想接收指定的返回值,可以使用哑元(dummy variable),例如:

_,x = foo2()
print(x)    -- 'b'

另一种方式是使用select函数:

select(index, ...),返回所有>=index的参数;当index='#',返回参数个数

function foo3() return 'a', 'b', 'c' end
print(select(, foo3())) -- a b c
print(select(, foo3())) -- a b
print(select(, foo3())) -- a
print(select('#', foo3())) --

在表达式中调用函数时:

1、当函数调用作为表达式最后一个参数(或仅有一个参数)时,函数尽可能多地返回多个值,不足补nil,超出舍去;

2、其他情况下,函数调用仅返回第一个值(如果没有返回值为nil);

x,y=foo2()            -- x='a',y='b'
x=foo2()     -- x='a', 'b' is discarded
x,y,z=,foo2()    -- x='10',y='a',z='b'
x,y=foo0()    --x=nil,y=nil
x,y=foo1()    -- x='a', y=nil
x,y,z=foo2()    -- x='a', y='b',z=nil x,y=foo2(),    --x='a',y=20
x,y=foo0(),,   -- x=nil,y=20, 30 is discarded
x,y,z=foo0(),foo2() -- x=nil,y='a',z='b'

函数调用在table构造器中使用时:

a = {foo0()}        -- a={}, a is empty
a = {foo2()} -- a={a,b}
a = {foo0(),foo1(),foo2(),} -- a={nil,a,a,b,4}

函数调用作为函数参数被使用时:

print (foo0())      --
print (foo1()) -- a
print (foo2()) -- a b
print (foo2() .. 'x') -- ax

可以使用圆括号"()"强制使调用只返回一个值:

print ((foo0()))      -- nil
print ((foo1())) -- a
print ((foo2())) -- a

unpack 函数接受一个数组作为输入参数,并返回数组的所有元素。

a={"england",,"china",, x="america"}
print(unpack(a)) -- england 960 china 30

上面的print函数可以打印可变参数。

2、可变参数

在Lua中,使用 ... 表示可变参数,在函数中可变参数会存放在arg的一个table中,它有一个域n表示参数个数。

function g(a,b,...)
result = ""
for i,v in ipairs(arg) do
result = result .. tostring(v) .. '\t'
end
result = result .. '\n'
end g() -- a=3, b=nil, arg={n=0}
g(,) -- a=3, b=4, arg={n=0}
g(,,,) -- a=3, b=4, arg={5,8,n=2}

如上面所示,Lua会将前面的实参传给固定参数,后面的实参放在arg表中。

Lua函数之一的更多相关文章

  1. C中调用Lua函数

    我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglob ...

  2. Lua函数之二

    Lua函数之二 Lua中函数的两个重要特性: 1.函数和其他类型(如number.string)一样,可以存放在变量中,也可以存放在table中,可以作为函数的参数,还可以作为函数的返回值. 2.嵌套 ...

  3. 一些LUA函数(转载)

    转自http://hi.baidu.com/chevallet/item/9a3a6410c20d929198ce3363 一些LUA函数 1.assert (v [, message]) 功能:相当 ...

  4. C语言调用Lua函数

    记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪. 那个时期,人们常常称互联网为赛博空间.现在工作了,大量的零碎时间用于上微博,知乎,QQ.这些碎片化的阅读 ...

  5. C模块回调Lua函数的两种方法

    作者:ani_di 版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di C模块回调Lua函数的两种方法 lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平 ...

  6. Lua函数以及闭合函数的理解

    Lua函数以及闭合函数的理解 来源 http://blog.csdn.net/mydad353193052/article/details/48731467 词法域和第一类型 在C/C++,C#或者J ...

  7. lua函数随记

    在大多数Lua语法分析中可以获得这些标准Lua函数. 无可争辩, 我们可以查阅Lua网站, 但是一些少了的函数被Blizzard进行了调整. 下面列出了所有Lua函数. WoW API中的Lua注意在 ...

  8. Lua 函数参数 & 默认实参

    [1]Lua函数,默认实参 习惯了其他语言(如C++)的默认实参,利用Lua语言的过程中,发现没有默认实参这种机制. 所以,自己模拟了一个满足业务需求的带默认实参的函数. (1)示例如下: local ...

  9. Lua函数[转]

    在大多数Lua语法分析中可以获得这些标准Lua函数. 无可争辩, 我们可以查阅Lua网站, 但是一些少了的函数被Blizzard进行了调整. 下面列出了所有Lua函数. WoW API中的Lua注意在 ...

随机推荐

  1. C语言 预处理一(文件包含--#include)

    //预处理命令不需要在结束末尾加":" //#inlude可以包含任意类型的文件 //#inlude 将一个源文件的全部内容包含到另一个源文件中,成为它的一个部分,文件包含的一般格 ...

  2. iBatis.Net(C#)数据库查询

    引用请注明http://www.cnblogs.com/13590/archive/2013/03/14/2958735.html  摘要:查询是数据库SQL语言的核心,本文介绍了通过iBatis.N ...

  3. 机器学习算法 Python & R速查表

  4. Java Concurrency in Practice 读书笔记 第二章

    第二章的思维导图(代码迟点补上):

  5. 1从零开始学习Xamarin.iOS安装篇

    安装和配置xamarin.ios 最近.net 开源新闻很火呀,于是想学习xamarin,早1年前就了解过这个东西,但是一直没有时间来学习,我这里装的是MAC上面的版本,废话不多说开始第一步安装. 概 ...

  6. Java NIO框架Mina、Netty、Grizzly介绍与对比(zz)

    Mina:Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用 ...

  7. [Android] emualtor-5554 offline的解决方法

    现象:用adb devices命令总发现emualtor-5554 offline,在.android目录下面并没有发现这个设备,没法删除.原因:有程序占用5555端口,导致adb认为5554不能作为 ...

  8. 20135306黄韧[2.72 2.77 3.70](http://i.cnblogs.com/EditPosts.aspx?opt=1)

    2.72 A.size_t是无符号整数,因此左边都会先转换为无符号整数,它肯定是大于等于0的. B.判断条件改为 if(maxbytes > 0 && maxbytes > ...

  9. Java四种引用包括强引用,软引用,弱引用,虚引用。

    Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...

  10. WPF之TreeList的实现方法(一)

    做项目的时候根据需求,WPF现有的控件不能完全满足我们的需求, 很多时候我们需要对现有的控件做一下加工. 最简单的我们可能会把Tree转换成List形式有的叫Grid形式就像下图一样 今天我先做一个完 ...