此外,函数本身也是一个变量,比如:
  dp@dp:~ % cat test.lua
  local mylen={}
  mylen.len3=function (x,y,z)
  return math.sqrt(x*x+y*y+z*z)
  end
  mylen.len2=function (x,y)
  return math.sqrt(x*x+y*y)
  end
  print(mylen.len2(10,9))
  print(mylen.len3(10,9,-9))
  dp@dp:~ %
  dp@dp:~ % lua test.lua
  13.453624047074
  16.186414056239
  dp@dp:~ %
  可以定义闭包,将一个函数写在另一个函数之内,定义在内部的函数可以访问外部函数的局部变量,lua中称之为closure:
  dp@dp:~ % cat test1.lua
  function mysum(i)
  local sums=0
  return function()
  sums=sums+i
  return sums
  end
  end
  my_sum=mysum(2)
  print(my_sum())
  print(my_sum())
  print(my_sum())
  my_sum=mysum(9)
  print(my_sum())
  print(my_sum())
  print(my_sum())
  dp@dp:~ % lua test1.lua
  2
  4
  6
  9
  18
  27
  dp@dp:~ %

  可以使用loadfile与dofile将整个lua代码做为函数来执行:
  > dofile("test1.lua")
  2
  4
  6
  9
  18
  27
  > dofile("test.lua")
  13.453624047074
  16.186414056239
  > myf=loadfile("test.lua")
  > myf()
  13.453624047
074
  16.186414056239
  也可以通过loadstring定义一段语句
  然后将这段语句做为一个函数执行
  > myf=loadstring("x=x*2")
  > x=10
  > myf()
  > print(x)
  20
  > myff=loadstring("x=io.read();x=x+2;print(x)")
  > myff() www.tygj123.com
  234
  236
  检查条件,触发错误
  dp@dp:~ % cat mysum.lua
  mysum=0
  while true do
  print("请输入一个数(输入0退出计算)")
  num=assert(io.read("*number"),"非数字输入")
  print(num)
  if num==0 then break end
  end
  dp@dp:~ %
  dp@dp:~ % lua mysum.lua
  请输入一个数(输入0退出计算)
  asdf
  lua: mysum.lua:4: 非数字输入
  stack traceback:
  [C]: in function 'assert'
  mysum.lua:4: in main chunk
  [C]: in ?
  dp@dp:~ %
  或
  mysum=0
  while true do
  print("请输入一个数(输入0退出计算)")
  num=io.read("*number")
  if not num then error("非数字输入") end
  print(num)
  if num==0 then break end
  End
  运行后,输入非数字会触发错误而退出
  dp@dp:~ % lua mysum1.lua
  请输入一个数(输入0退出计算)
  1342
  1342
  请输入一个数(输入0退出计算)
  asf
  lua: mynum1.lua:5: 非数字输入
  stack traceback:
  [C]: in function 'error'
  mynum1.lua:5: in main chunk
  [C]: in ?
  dp@dp:~ %
  也可使用pcall调用可能发生错误的函数,然后进一步处理错误
  my_sum=0 www.yztrans.com
  function mysum()
  while true do
  print("请输入一个数(输入0退出计算)")
  num=io.read("*number")
  if not num then error("非数字输入") end
  if num==0 then break end
  my_sum=my_sum+num
  end
  end
  if pcall(mysum) then
  print("计算完毕,累加结果:"..my_sum)
  else
  print("只能输入数字,程序异常退出!")
  print("累加结果:"..my_sum)
  end
  dp@dp:~ % lua mysum.lua
  请输入一个数(输入0退出计算)
  234
  请输入一个数(输入0退出计算)
  -324
  请输入一个数(输入0退出计算)
  88
  请输入一个数(输入0退出计算)
  123
  请输入一个数(输入0退出计算)
  0
  计算完毕,累加结果:121
  dp@dp:~ % lua mysum.lua
  请输入一个数(输入0退出计算)
  234
  请输入一个数(输入0退出计算)
  -11
  请输入一个数(输入0退出计算)
  233
  请输入一个数(输入0退出计算)
  88
  请输入一个数(输入0退出计算)
  asdf
  只能输入数字,程序异常退出!
  累加结果:544

游戏算法中lua脚本详解的更多相关文章

  1. SVD在推荐系统中的应用详解以及算法推导

    SVD在推荐系统中的应用详解以及算法推导     出处http://blog.csdn.net/zhongkejingwang/article/details/43083603 前面文章SVD原理及推 ...

  2. FLASH动作脚本详解

    FLASH动作脚本详解 一.FLASH脚本基础入门讲解 二.按钮AS的编写 三.影片剪辑的AS编写 四.动态文本框 五.影片剪辑的拖拽 六.流程控制与循环语句 七.绘图及颜色的AS的编写 八.声音 A ...

  3. 「翻译」Unity中的AssetBundle详解(一)

    AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...

  4. [翻译]Unity中的AssetBundle详解(三)

    构建AssetBundles 在AssetBundle工作流程的文档中,我们有一个示例代码,它将三个参数传递给BuildPipeline.BuildAssetBundles函数.让我们更深入地了解我们 ...

  5. 「翻译」Unity中的AssetBundle详解(二)

    为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...

  6. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  7. 转:LoadRunner中参数化技术详解

    LoadRunner中参数化技术详解 LoadRunner在录制脚本的时候,只是忠实的记录了所有从客户端发送到服务器的数据,而在进行性能测试的时候,为了更接近真实的模拟现实应用,对于某些信息需要每次提 ...

  8. 【转】linux中inittab文件详解

    原文网址:http://www.2cto.com/os/201108/98426.html linux中inittab文件详解 init的进程号是1(ps -aux | less),从这一点就能看出, ...

  9. DIV css中cursor属性详解-鼠标移到图片变换鼠标形状 (转)

    css中cursor属性详解-鼠标移到图片变换鼠标形状   语法: cursor : auto | all-scroll | col-resize| crosshair | default | han ...

随机推荐

  1. Spark on YARN的两种运行模式

    Spark on YARN有两种运行模式,如下 1.yarn-cluster:适合于生产环境.        Spark的Driver运行在ApplicationMaster中,它负责向YARN Re ...

  2. jQuery中bind,live,delegate与one方法的用法及区别解析

    bind( )方法用于将一个处理程序附加到每个匹配元素的事件上并返回jQuery对象. .bind(eventType[, evnetData], Handler(eventObject)) 其中,参 ...

  3. Jenkins 初见

    在网上貌似没有找到Jenkins的中文的太多的文档,有的都是关于Hudson的一些 零零散散的,所以自己边学习边实践总结了以下系列文章,希望有助于大家对于Jenkins的使用. 本系列文章是基于我3年 ...

  4. C++ —— 非常量引用不能指向临时对象

    目录 举例 分析 解决 1.举例 非常量引用 指向 临时对象 —— 即:将 临时对象 传递给 非常量引用类型. 如以下情况就会出现: 实现实数Rational类,实数可以使用+号相加,运算的结果要可以 ...

  5. struct 结构

    //原始套接字学习笔记之代码结构 /* *host端程序结构 */ #include <> #define .. //主函数 int main() { //建立发送线程 pthread_t ...

  6. TeamViewer或者向日葵等无法成功远程登录

    之前一直能正常远程的两台电脑,今天不知道什么原因,莫名其妙的就无法登录了. 更悲催的时,今天早上走的时候,忘把TeamViewer或者向日葵软件启动了. 还好,我登录向日葵官网,在管理中心设置里面开启 ...

  7. &quot;蓝筹&quot;如何使程序猿?

    "蓝筹"这个词可能不是很多人知道这意味着什么.我会来普及知识.这是最重要的概念是指"越来越从长远来看更有价值"的含义.作为一个程序猿,我想你想使自己通过实际行动 ...

  8. quick-cocos2dx学习笔记

    20140603 下载quick,拉开拉链,跑setup.bat(注意,setup事就是在系统环境变量里加入QUICK_COCOS2DX_ROOT,假设不运行这个的话,启动player时会报找不到fr ...

  9. 【剑指offer】链表倒数第k个节点

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在 ...

  10. WinSock IO模型 -- WSAEventSelect模型事件触发条件说明

    FD_READ事件 l  调用WSAEventSelect函数时,如果当前有数据可读 l  有数据到达时,并且没有发送过FD_READ事件 l  调用recv/recvfrom函数后,仍然有数据可读时 ...