(2012-04-12 23:32:35)

 
函数
 定义
    function mytest(a,b,c) <函数体> end
    mytest = function(a,b,c) <函数体> end
    local function mytest(a,b,c) <函数体> end
    local mytest = function(a,b,c) <函数体> end
    t = {} t.mytest = function(a,b,c) <函数体> end
    t = { mytest = function(a,b,c) <函数体> end}
    t = {} function t.mytest(a,c,b) <函数体> end
 
  调用
    基本调用 
        a,b,c = mytest(1,2,3)
    冒号语法糖调用
        o.foo(o,x) = o:foo(x) 
        使用冒号调用时会把冒号前的内容当作函数的第一个参数传入
    多重返回值
        function mytest()
                return 1,2,3
        end
        a,b = mytest()
        assert(a==1 and b==2)
        a,b,c,d = mytest()
        assert(c==3 and d==nil)
        assert(select("#",mytest()==3))
    变长参数
        function mytest(...)
                a,b=...
                return a,b
        end
        a,b = mytest(1,2)
        assert(a==1 and b==2)
         "..."是表达式,代表变长参数如:return ...就是返回所有传入的参数
        {...}代表所有变长参数的集合,可以象使用table的一样访问也可以用ipairs{...}遍历
        select函数操作访问变长参数的能力
        select(n, ...)访问第n个参数
        select("#", ...)获得参数个数
    特殊调用
        当函数仅有一个参数并且是字符串时可以使用 mytest "wangning"方式,不用写()
        当函数仅有一个参数并且是table时可以使用 mytest {a=1, b=2, c=3}的方式,不用写()
    具名实参
        function showwindow(opt)
                print(opt.x)
                print(opt.y)
                 print(opt.title)
                print(opt.text)
        end
        showwindow {x=0, y-0, title="hi!", text="helloworld"}
 
  闭包(词法域)
    在函数内定义函数,内部函数可以访问外部函数的变量
        function mytest()
                local i = 0
                return function()
                i = i + 1
                return i
                end
        end
        my = mytest()
        print(my()) --> 1
        print(my()) --> 2
        my1 = mytest()
        print(my1()) -->1
        print(my1()) -->2
        print(my()) --> 3
    函数式编程的基础
    可以实现如迭代器之类的功能,实用性很高
    这种形式就是实现了单一功能的类的对象
 
  尾调用消除 tail-call elimination
    最后一句如果是一个函数调用就是尾调用
    相当于goto,也可用于状态机
    当前函数真正结束,不会在栈中了
    return <func>(<args>)才是真正的尾调用
    function f(x) g(x) end不是尾调用,它还会回来
 

lua学习笔记(六)的更多相关文章

  1. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  4. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  5. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

  9. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  10. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

随机推荐

  1. LCA【bzoj3364】 [Usaco2004 Feb]Distance Queries 距离咨询

    Description  奶牛们拒绝跑马拉松,因为她们悠闲的生活无法承受约翰选择的如此长的赛道.因此约翰决心找一条更合理的赛道,他打算咨询你.此题的地图形式与前两题相同.但读入地图之后,会有K个问题. ...

  2. Leave It Behind and Carry On ---- 高一下期末考反思 [补档]

    背景 这个学期的前\(\frac{3}{4}\), 我都是在停课集训中度过的, 先是GDKOI, 再是北京集训, 最后是GDOI, 结果GDOI还没进day3就滚粗了. 学校的内容是考完GDOI后回学 ...

  3. vs2012 ultimate 密钥

    Visual Studio Ultimate 2012 静态激活密钥,可以试一下. RBCXF-CVBGR-382MK-DFHJ4-C69G8

  4. SQL SERVER Update from 使用陷阱

    原文:SQL SERVER Update from 使用陷阱 update A set from A left join B on 此方法常用来使用根据一个表更新另一个表的数据,来进行数据同步更新.若 ...

  5. ARM32 Linux kernel virtual address space

    http://thinkiii.blogspot.jp/2014/02/arm32-linux-kernel-virtual-address-space.html   The 32-bit ARM C ...

  6. 用DVD镜像离线安装Debian的软件包

    先介绍一下环境: 虚拟机:debian7.2.0 主机: Win7 方法一: 由于有时候无法联网就需要离线安装软件包,可以把debian官网上列出的几个DVD镜像都下下来,其实主要是DVD1,这样就不 ...

  7. 永久关闭WPS热点

    可以通过设置WPS,关闭广告推送和热点即可,方法如下 准备:打开已经安装wps的设备 1.单击电脑左下角,找到wps 2.选中WPS Office中的配置工具 3.在弹窗中选择“高级” 4.打开之后选 ...

  8. zap安装和部署

    1.zap的安装 注意一点测试环境新申请的linux系统java执行路径是/usr/install/java/bin/java,安装zap的时候,会提示找不到java运行环境,解决办法是:做一个软链接 ...

  9. apache 配置防盗

    防盗链目的:防止其他网站盗用自己的网站而增加额外的流量损失 SetEnvIfNoCase Referer "^http://.*\.yourdomin\.com" local_re ...

  10. GLSL实现Glow效果 【转】

    http://blog.csdn.net/a3070173/article/details/3220940 Glow即辉光效果现在已成为3D图形中一个引人注目的特效.本文主要介绍如何使用GLSL实现一 ...