注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Lua战记4——函数进阶  

2012-01-25 15:49:54|  分类: Lua学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

Lua战记4——函数进阶

这里要说明一下,函数在LUA里你就认为是一种变量,就象C和C++里的函数指针一样,你当成变量看也没有什么错误。

既然是变量,就会有local 和global,所以就不得不提到闭包closure和upvalue,先讲一下函数调用时的一些参数的使用,这个很类似于C中的不定长参数和泛型传递。

1、  不定参数
function unknownfunc (...)  
for i=1, arg.n do      
print("the value is: " .. arg)  
end
end
unknownfunc("111", "222")
运行结果
thie value is: 111
the value is: 222
这个其实和C中的变参传递没有什么根本的区别,了解C变参传递原理的都可以轻易的明白过来,在LUA中,如果函数的参数以…为参数,刚表示参数的数量不定,不过在C里必须有至少一个参数,然后才能…,LUA中将参数自动存储到一个叫arg的表中,其中arg.n存放参数的个数,利用数组的方法arg[]就可以遍历这些个参数了。
2.以table做为参数
function tablefunc(t)  
for k,v in t do      
print(k .. "=" .. v)  
end
end
tbalefunc{x=1, y=2}
运行结果
x=1
y=2
这里有一个需要注意的地方,如果明确的构造一个table,然后再传递到函数中去,就会不断的生成新的table,gc会在一个合适的时机进行回收,而这个时机如果一旦控制不好,就会形成内存的瓶颈,所以应该象上面一样,直接传递两个参数过去。
3.把Lua变成类似XML的数据描述语言
function contact(t)  
end
contact {  
name = "Game Developer",  
email = "hack@ogdev.net",  
url = "http://www.ogdev.net/",  
quote = [[      
There are
10 types of people    
who can understand binary.]]
}
contact {  
-- some other contact
}
 这里定义了contact这个函数,同时,这个函数自动生成一个table数据结构,他的优势在于和C交互时会非常方便。

说明:[[...]]是表示多行字符串的方法
再说明一下闭包和upvlaue:

1、  upvalue:

例子:

 a) function func1(n)

  -- 函数参数也是局部变量

  

  local function func2()

  print(n) -- 引用外包函数的局部变量

  end

  return func2

  end

  

  gp1 = func1(1979)

  gp1() -- 打印出1979

  gp2 = func1(500)

  gp2() -- 打印出500

b)   function func1(n)

  local function func2()

  print(n)

  end

  n = n + 10

  return func2

  end

  

  gp1 = func1(100)

  gp1() -- 打印出110

一个函数它使用的外部的局部变量叫做upvalue,这个的作用主要是为了下面的closure才有意义。

2、  closure闭包:

看上面的b的例子,为什么会变成110呢,a中的例子为什么会不变呢?这就是闭包的原因,他有些类似C中的函数的返回值,在a中,因为n是func2的upvalue所以他可以保存下来,形成一个闭包,而在这个闭包里,n得以继续可以使用。

b的例子中,闭包将n拷贝到了自己的空间,供其它使用的地方使用,在n=n+10以前,闭包就已经创建,而n仍然在作用域的范围,也即是在堆栈管理的空间,所以这时可以随时引用它,但return func2后,由于离开了闭包空间,所以会将n拷贝走。

这个函数的使用还有很多的知识点,大家慢慢学。

坚持到底,就是胜利。

  评论这张
 
阅读(1387)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017