Lua函数之一

函数声明:

function foo(arguments)

  statements

end

1、函数调用

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

os.date()

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

print "Hello World"

dofile "a.lua"

f{x=10,y=20}

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

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

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

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

f(3)          -- a=3, b=nil
f(3,4)        -- a=3, b=4
f(3,4,5)      -- 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(1, foo3()))    -- a b c
print(select(2, foo3()))    -- a b
print(select(3, foo3()))    -- a
print(select(‘#‘, foo3()))  -- 3

在表达式中调用函数时:

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

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

x,y=foo2()            -- x=‘a‘,y=‘b‘
x=foo2()              -- x=‘a‘, ‘b‘ is discarded
x,y,z=10,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(),20          --x=‘a‘,y=20
x,y=foo0(),20,30        -- 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(),4}        -- 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",960,"china",30, 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(3)             -- a=3, b=nil, arg={n=0}
g(3,4)           -- a=3, b=4, arg={n=0}
g(3,4,5,8)       -- a=3, b=4, arg={5,8,n=2}

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

时间: 2024-11-25 18:16:52

Lua函数之一的相关文章

C语言调用Lua函数

记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪.那个时期,人们经常称互联网为赛博空间.如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息.然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部<红楼梦>那么多的文字.只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识.在你的时间线上,两条相邻信息往往是八竿子也打不着的.而且你还时不时去

lua函数精讲(一)

函数的用途: 1.完成指定的任务,这种情况下作为调用语句使用. 2.计算并返回值,这种情况下,函数作为赋值语句的表达式使用. 函数的参数为空,必须使用()表示函数调用.例外:当函数只有一个参数,并且这个参数是字符串或表构造时,()是可选的. lua提供了面向对象调用函数的语法 o:foo(x)与o.f(o,x)是等价的. lua函数的实参与形参的匹配与赋值语句类似,多余部分被忽略,缺少部分nil补足. lua函数可以返回多个值,return后列出要返回值的列表即可返回多值 s, e = stri

C中调用Lua函数

我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglobal(L, "f"); // 获取lua函数f lua_pushnumber(L, x); // 压入参数x和y lua_pushnumber(L, y); if(lua_pcall(L, 2, 1, 0) != 0) error(L, "error running functi

Lua函数执行流程及函数延续点问题的研究

第一:Lua函数调用的总体流程 在保护性调用的情况下,lua中函数调用的流程如下,非保护性调用的流程更加简单,请追踪lua_call函数 int docall (lua_State *L, int narg, int nres) | —— int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc ...) | —— luaD_pcall (lua_State *L, Pfunc func, void *u,ptrdiff

lua 函数练习

1 --逻辑表达式 2 3 --1+2+3+...+n 4 function fun1(n) 5 local sum = 0 6 for i=1,n do 7 sum = sum + i 8 end 9 return sum 10 end 11 12 -- 计算奇数和 13 function fun2(n) 14 local sum = 0 15 for i=1,n,2 do 16 sum = sum + i 17 end 18 return sum 19 end 20 21 -- 计算偶数和

cocos2d-x 3.0 在C++中调用lua函数(2)

个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define __CC_LUA_STACKEX_H_ #include "CCLuaStack.h" NS_CC_BEGIN class LuaStackEx : public LuaStack { public: void call_script_fun(const char* fun) { exe

c++回调lua函数,实现事件

基于上一篇文章 cocos2dx 导出c++类供lua使用 上一篇主要是因为不能调用lua函数 才那样解决,但是本篇能调用lua函数,那么目的实现也就简单多了 归其原因还是tolua 工具生成的hpp cpp文件的函数不对 虽然在c++中函数参数声明为LUA_FUNCTION 但是还是被当做了int处理 所以我们要手动处理函数的调用 也就是修改生成的 函数 ... 生成的对应 代码 改为以下 if (NULL == tolua_S) return 0; int argc = 0; NetMgr*

lua函数随记

在大多数Lua语法分析中可以获得这些标准Lua函数. 无可争辩, 我们可以查阅Lua网站, 但是一些少了的函数被Blizzard进行了调整. 下面列出了所有Lua函数. WoW API中的Lua注意在WoWAPI没有提供所有标准的Lua函数, 很显然, 操作系统以及文件I/O库是不支持的 Lua函数这些函数都是Lua编程语言的一部分, 点击这里了解更多. ?assert(value) - 检查一个值是否为非nil, 若不是则(如果在wow.exe打开调试命令)显示对话框以及输出错误调试信息 ?c

C++访问lua函数性能测试结果

 转载请注明,来自:http://blog.csdn.net/skyman_2001 lua版本是5.1 1. windows平台 CPU: Intel Core i5 3.20GHz 3.60GHz 内存: 8G 操作系统:win7 64位 测试数据:执行125次耗时0.067毫秒 2. ios平台 iPhone 4s 测试数据: (1). debug模式:执行125次耗时1.078毫秒 (2). release模式:执行125次耗时0.669毫秒 C++访问lua函数性能测试结果

cocos2d-x 3.0 在C++中调用lua函数

代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_data) if user_data then user_data = tolua.cast(user_data, "user_data"); print (user_data:uid()); print (user_data:uname()); end end local ghall =