1,loadstring 编译的时候不关心词法范围:
  local i = 0
  f = loadstring("i = i + 1")

g = function () i = i + 1 end

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

i =
local i =
f = loadstring("i = i + 1 print(i)")
g = function () i = i + print(i) end print(f())
print(g())
-- 输出结果:

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 的虚文件的文件名。

dofile当作Lua运行代码的chunk的一种原始的操作。dofile实际上是一个辅助的函数。真正完成功能的函数是loadfile;与dofile不同的是loadfile编译代码成中间码并且返回编译后的chunk作为一个函数,而不执行代码;另外loadfile不会抛出错误信息而是返回错误代。我们可以这样定义dofile:

  function dofile (filename)
       local f = assert(loadfile(filename))
       return f()
 end
如果loadfile失败assert会抛出错误。loadfile更加灵活。在发生错误的情况下,loadfile返回nil和错误信息,这样我们就可以自定义错误处理。另外,如果我们运行一个文件多次的话,loadfile只需要编译一次,但可多次运行。dofile却每次都要编译。

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;

也可以用xpcall来来处理错误,并可将其封装为此下trycall函数(方便使用):

-- 打印错误信息
local function __TRACKBACK__(errmsg)
local track_text = debug.traceback(tostring(errmsg), );
print("---------------------------------------- TRACKBACK ----------------------------------------");
print(track_text, "LUA ERROR");
print("---------------------------------------- TRACKBACK ----------------------------------------");
local exception_text = "LUA EXCEPTION\n" .. track_text;
return false;
end --[[ 尝试调一个function 这个function可以带可变参数
如果被调用的函数有异常 返回false,退出此方法继续执行其他代码并打印出异常信息;]]
function trycall(func, ...)
local args = { ... };
return xpcall(function() func(unpack(args)) end, __TRACKBACK__);
end
--测试代码: trycall(function(param)
      print("message "..param)
      print("message "..nil)
end, "test trycall")

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(obj, param1, param2)
  print(obj, param1, param2)
  print(obj.test)
end
a = {}
setmetatable(a, meta)
a.test = "Oh-yeah"
a(a.test, )

-- 输出结果:

table: 0x7fd2f9404fc0 Oh-yeah 99
Oh-yeah

Programming in lua 杂记(转)的更多相关文章

  1. Programming in Lua读书笔记

         Lua的长处之一就是可以通过新类型和函数来扩展其功能.动态类型检查最大限度允许多态出现,并自动简化调用内存管理的接口,因为这样不需要关心谁来分配内存谁来释放内存,也不必担心数据溢出.高级函数 ...

  2. Learning Lua Programming (2) Lua编程基础

    开始学习Lua编程,首先从一些简单的语法开始. 一.编辑环境 下面推荐一个Lua编程的IDE,感觉是很强大的.ZeroBrane Studio,windows平台,mac平台都有.点击打开链接  官方 ...

  3. Programming in lua 环境

    Lua 用一个名为environment 普通的表来保存所有的全局变量.(更精确的说,Lua在一系列的environment 中保存他的“global”变量,但是我们有时候可以忽略这种多样性)这种结果 ...

  4. Programming In Lua 第十章

    1,lua中的数据结构都是表来实现的.数组就是索引为数值的表. 2,矩阵就是二维数组,三角矩阵就是矩阵的一半. 3,稀疏矩阵问题: 4, 5, 6,

  5. Programming In Lua 第八章

    1, 也就是说,lua虽然会把代码预编译成中间码,以提高运行速度.但其会在程序运行过程中需要编译器,所以其仍然是解释型语言.loadfile会加载一个文件并将其编译成中间码,并返回一个函数. 2, 3 ...

  6. Programming In Lua 第三章

    1, 2, 3, 4, 5,lua中,只有false和nil为假,0和空字符串为真. 6, 7,

  7. Programming In Lua 第二章

    1,lua基本类型:nil,boolean,number,string,userdata,function,thread,table.可以用函数type获取变量的类型. 2,lua中的字符串可以用单引 ...

  8. Programming In Lua 第一章

    1,Lua可以嵌入其他应用程序(如CGILua或IUPLua). 2,lua代码的语句,分号是可以省略的.同一行可以有多条lua语句,最好用分号隔开(当然也可以不隔开) 3,外壳与lua解释器的区别. ...

  9. lua杂记

    protoc-gen-lua 编译.安装.使用教程: https://blog.csdn.net/huutu/article/details/49672225 https://github.com/s ...

随机推荐

  1. 年月日 生日 js插件

    <script typet="text/javascript" src="http://libs.baidu.com/jquery/1.9.1/jquery.min ...

  2. noip2008-t3

    [题目描述] 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸 ...

  3. eclipse的maven项目报Missing artifact jdk.toos:jdk.toos:jar:1.6错

    很多框架都会依赖jdk中的tools.jar,但是maven仓库中却没有. 如在eclipse+maven编写mapreduce代码,就会报Missing artifact jdk.toos:jdk. ...

  4. 移动端字体缩放问题解决方案-摘自《html5移动web开发实践》

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. Popup - 弹出层

    //图片类快捷弹出层 <a href="" target="_blank"> <div class="panlifang1" ...

  6. AOP实现原理

    Spring 为解耦而生,其中AOP(面向切面编程)是很浓重的一笔. 本文来探讨一下AOP实现的原理. 一. 概述 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负 ...

  7. C# GetHashCode与Equals在HashTable表查找时的关系

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; using Syst ...

  8. select 取的是session里面的值时

    原来是写了一个select标签,然后用js循环取出来,发现问题是本来嵌在页面右边的页面整个弹出来, 后来改成html:optionsCollection就好了: 效果图:

  9. VIM使用(一) VIM插件管理利器-vundle

    有关VIM的文件网上一大堆,这里只是记录一下我新配置环境的步骤.以备查看参考. sudo apt-get install gitgit clone https://github.com/gmarik/ ...

  10. 在WPF的WebBrowser控件中屏蔽脚本错误的提示

    在WPF中使用WebBrowser控件显示网页时,经常会报脚本错误的提示,如何屏蔽掉这些错误提示呢.方法是定义如下方法: public void SuppressScriptErrors(WebBro ...