• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Programminginlua杂记

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
1,loadstring 编译的时候不关心词法范围:
  local i = 0
  f = loadstring("i = i + 1")

  g = function () i = i + 1 end 

  这个例子中, 和想象的一样g 使用局部变量i , 然而f 使用全局变量i ; loadstring 总是在全局环境中编译他的串。

 

2,require 和dofile 完成同样的功能但有两点不同:

    => require 会搜索目录加载文件

    => require 会判断是否文件已经加载避免重复加载同一文件。由于上述特征, require 在Lua 中是加载库的更好的函数。

   为了确定路径, Lua 首先检查全局变量LUA_PATH 是否为一个字符串, 如果是则认为这个串就是路径; 否则require 检

   查环境变量LUA_PATH的值, 如果两个都失败require 使用固定的路径( 典型的"?;?.lua" ) 

 

  Lua 保留一张所有已经加载的文件的列表( 使用table 保存) 。如果一个加载的文件在表中存在require 简单的返回; 表 

  中保留加载的文件的虚名, 而不是实文件名。所以如果你使用不同的虚文件名require 同一个文件两次,将会加载两次该文

  件。比如require "foo" 和

  require "foo.lua" , 路径为"?;?.lua" 将会加载foo.lua 两次。我们也可以通过全局变量_LOADED访问文件名列表。

  在require运行一个chunk 以前, 它定义了一个全局变量_REQUIREDNAME 用来保存被required 的虚文件的文件名。 

 

3,lua的错误处理

   n = assert(io.read("*number"), "invalid input") 

   assert 首先检查第一个参数, 若没问题, assert不做任何事情; 否则, assert 以第二个参数作为错误信息抛出。第二个参

   数是可选的。注意, assert 会首先处理两个参数, 然后才调用函数。

   基本的原则是: 对于程序逻辑上能够避免的异常, 以抛出错误的方式处理之, 否则返回错误代码。

 

4,如果在Lua 中需要处理错误, 需要使用pcall 函数封装你的代码。 

  if pcall(function () ... end) then ...else ... 

 

 

  local status, err = pcall(function () error({code=121}) end)
  print(err.code) --> 121 

 

 

  两个常用的debug 处理函数: debug.debug 和debug.traceback 

 

5,lua中的对象

  当一个表的metatable存在一个__index函数时,如果Lua调用一个原始表中不存在的函数,Lua将调用这个__index指定的函数。 

 这样可以用__index实现在多个父类中查找子类不存在的域。

 

6,变长参数
  必须作为最右边的形参出现,function f(...) return ... end...不是一个table,而是一个多值,所以可以像其他多值一样使用  

   local a, b = ...如果需要作为table使用,则将其放  入{}即可for i,v in ipairs({...}) do print(v) end如果...中含有nil,则

   最好通过 select函数来访问for i=1, select("#", ...) do print(select(i, ...)) end 

 

 7,解释器

    lua [options] [script [args]]
    -e stat: executes string stat;
    -l mod: "requires" mod; 
    -i: 在执行完其他选项之后,进入交互模式
   各选项会依序处理,如
   $ lua -e'a=1' -e 'print(a)' script.lua
   $ lua -e"_PROMPT='myprompt> '" -i
    命令行参数为arg,脚本参数的下标从1开始,如果定义了环境变量LUA_INIT,那么该变量对应的文件将会首先执行
    交互模式中=开始的表达式等价于print该表达式的值
   >a=5
   >=a --等价于print(a)

 

 8.__call元方法释义

    当我们写下a(b,c )时,若a不是函数,那么a.metatable.__call(a, ...)将调用:
    meta = {}
    meta.__call = function(a, b, c) print(a, b, c) end
    a = {}
    setmetatable(a, meta)
    a(10, 11)

 

 

 


 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua加载动态库发布时间:2022-07-22
下一篇:
1-STM32嵌入LUA开发(控制小灯闪耀)发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap