博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Lua笔记

Posted on 2009-08-24 10:08  Zhiyett  阅读(2099)  评论(1编辑  收藏  举报
  1. Hello world

-- test.lua

function fact(n)

if n==0 then

return 1;

else

return n*fact(n-1);

end

end

 

print("Hello, World!");

a=io.read("*number");

print(fact(a));

  1. 交互模式

  1. 注释
  • 行注释:--
  • 块注释:--[[开始 …..结束]] ,常用--[[ …. --]] 或--[=[ …]] …]=](之间可以加任意数量的等号)
  1. 全局变量
  • 初始值为nil
  • 若要删除只需赋予nil值就行
  1. 解释器程序
  • 下载地址:http://www.lua.org
  • lua [选项参数] [脚本参数]
    • 选项参数-e直接输入代码
    • -l 加载库文件
    • -i 运行完后进入交互模式

lua -i –l a –e "x=10"

  • 可以直接打印任何表达式的值,以等号开头

  • 解释器执行参数之前,会先查找一个名为LUA_INIT的环境。
    • 若找到,且LUA_INIT=@文件名,则会先执行此文件。
    • 若找到,但没以@开头,则将LUA_INIT=变量
  • 命令行参数

lua –e "sin=math.sin" script a b

arg[1]=="a"

arg[2]=="b"

  1. 类型与值

8种基础类型:nil、boolean、number、string、userdata、function、thread、table。

判断类型名称使用type,返回的是字符串

 

  1. nil

  1. boolean
  • true和false
  • 在条件测试中,把数字0和空字符串也视为真
  1. number
  • 以浮点数进行运算。4、4.4、 4.55e-3、0.3e12、5e+20
  • 若要以整数进行运算,需重新编译lua。详见luaconf.h
  1. string
  • 字符串不可修改,要修改需重新创建

a="one aa";

b=string.gsub(a,"one","two");

print(a) --输出one aa

print(b)--输出two aa

  • 转义序列
    • \f、 \n、 \r 、\t、 \\ 、\"、 \'等
    • \ddd 如\097
    •  

      \a --- bell

      \b --- backspace

      \f --- form feed

      \n --- newline

      \r --- carriage return

      \t --- horizontal tab

      \v --- vertical tab

      \\ --- backslash

      \" --- quotation mark

      \' --- apostrophe

      \[ --- left square bracket

      \] --- right square bracket

      \ddd ===> 转义成 ddd 对应的字符。比如 print("\65") ===> A

  • 块字符串
    • 使用[[ … ]]

page=[[

<html>

</html>

]]

  • 在[中加任意数量的等号,如[=[ … ]=]

page=[===[

<html>

[[…]]

</html>

]===]

  • 字符串转整数

local szDigital = "123456";

local nResult = szDigital + 333;

-- 结果是 nResult 是 123789

  • 建议最好使用tonumber(…)

    local line = io.read();

    local n=tonumber(line);

    if nil==n then

        error(line.."is not a valid number");

    else

        print(n*3);

    end

  • 字符串连接(整数转字符串)

local nItemType = 123;

local szItemType = "aa" .. nItemType;

-- 结果是 szItemType 是 "aa123"

  • 建议最好使用tostring(…)

    print(tostring(10) == "10") àtrue

    print(10 == "10") àfalse

获得字符串长度#

local a="hello";

print(#a); -->5

  1. table

table没有大小,可以任意地添加。

1、数组定义:

local array = { 1, 2, 3, 4 };

local array2 = {

{ 1, 2, 3 },

{ 2, 3, 4 }

};

2、数组使用:

a = array[1];

b = array2[1][3];

3、注意:数组的下标是1基的。也就是array是从1~4。

4、local size = table.getn(array) --这样可以取到表的长度为4(需要lua_tablibopen库支持)

5、数组元素的最后一个值后面,可以多加一个逗号(,)。例如:local array = { 1, 2, 3, 4, };

local a={};

a["10"]=10;

a[10]="abc";

a["abc10"]=a["10"]..a[10];

 

local b=a;

print(b["10"]); à10

a=nil;

print(b["10"]); à10

b=nil;

 

local a={};

a["aa"]=10;

print(a.aa); à10

 

b="bb";

a[b]=20;

print(a[b]); à20

print(a.b);ànil

print(a.bb);à20

注意:lua将nil作为数组结尾,所以应避免使用#。如果真的要使用含有nil的数组,可以使用table.maxn()

a={};

a[100]=1;

print(table.maxn(a)); à100

print(#a); à0

 

  1. function

注意:内部变量必须用"local "来限定,否则会被LUA当成"全局变量"。

  1. userdata
  2. thread

 

  1. 表达式

    1. if表达式

if (条件) then

语句1;

语句2;

end

 

if (条件) then

语句1;

语句2;

else

语句3;

end

 

if (条件) then

语句1;

语句2;

elseif (条件) then

语句3;

end

 

  1. "条件"的写法:

if (a > b and c < d) then    -- && !

if (a <= b or c >= d) then

if (not (a == a)) then

if (a ~= b) then         -- 不等于

注意:除"nil"与bool类型的"false"以外, 一切数字与字符串(包括0与空串)都是true。

如果想判断一个值是不是C++意义上的TRUE,可写成:

if (a ~= 0) then

  1. 循环

1、普通for循环

for i=1,10 do

print(i)

end

2、递减的for循环

for i=10,1,-1 do

print(i)

end

3、注意:for语句中的 i 是local型的局部变量,仅在"for循环内部"有效。    !

注意:在循环中不要去修改控制变量 i 。    !

注意:如果在条件部分(for和do之间)有函数调用,这些函数只会调用一次。

  1. while循环及break调用

local i = 1

while a[i] do

if a[i] == v then break end

i = i + 1

end