`

Lua学习笔记

 
阅读更多

一、Lua基础知识

Lua区分大小写。

几条连续的Lua语句之间不需要分割,如果需要可以用分号;分割。

一般约定以下划线开头连接一串大写字母变量(比如 _VERSION)被保留用于 Lua 内部全局变量。

默认情况,变量总是全局的。

全局变量不需要声明,给一个变量赋值后即创建了这个全局变量。

访问一个没有初始化的全局变量返回结果是nil。

删除一个全局变量,只需要将变量赋值为nil。

当且仅当一个变量不等于nil时,这个变量即存在。

字符串由一对双引号或单引号来表示。

function是一种数据类型,表示C或Lua编写的函数。函数可以存在变量里。

给全局变量赋一个nil值,等同于把它们删掉。

Lua把false和nil看作是"假",其他的都为"真"。

以用2个方括号"[[]]"来表示"一块"字符串。

字符串连接使用的是..,在数字后面使用时要加个空格。

尽量避免使用强制转换,可以使用函数tonumber将字符串转为数字(无法转换返回nil),tostring将数字转为字符串。

使用#来计算字符串或表的长度,放在前面#str。a["name"]可以写作a.name 。

在Lua里表的默认初始索引一般以1开始。

Lua函数可以存储在变量中,可以通过参数传递给其他函数,可以作为其他函数的返回值。

Lua函数可以返回多个值,每个值以逗号隔开。

Lua函数可以接受可变数目的参数,在函数参数列表中使用三点(...) 表示函数有可变的参数。

Lua将可变函数的参数放在一个叫arg的表中,#arg表示传入参数的个数。

Lua脚本执行:lua luascript.lua

==用于相等性测试,~=用于不等性测试。nil只与自身相等。

多重赋值中,Lua先对等号右边所有元素求值,然后才进行赋值:x,y = y,x  等同于交换x y变量的值。

使用do-end,可以显示的界定一个程序块,lua不会单独执行do后面的每行内容,直至遇到一个相应的end。

尽可能的使用局部变量。

break和return只能是程序块的最后一条语句,如果想要放在其他位置,需要显示的do-end包住一个return。

 

lua函数出现在一个表达式中,lua会把函数的返回值数量调整为1。table构造式{}可以完整的接收一个函数调用的所有结果,不会有任何数量方面的调整。但仅限于函数调用作为table最后一个元素时才会发生,其他位置的函数调用仅产生一个结果值。可以将函数调用放入一对()中,从而迫使他只返回一个结果:(foo())

 

unpack函数

 

(lua 5.2)

 

二、关于table表

1、先定义一个空table:

-- 定义一个全局的table
test_table = {}
-- 打印出来,结果是table的地址
print(test_table) 
-- 输出结果 table: 0073B1C8

然后可以给table赋值:

test_table[1]="a"
test_table[2]="b"
test_table[3]="c"
for k,v in pairs(test_table) do       
    print( test_table[k] )
end
输出为a,b,c。

2、当然也可以这样定义key为字符串:

test_table = {[1]="a",[2]="b",[3]="c",["str1"]="d",["str2"]="e"}

for k,v in pairs(test_table) do
    print( k,"-",v )
end

这时打印结果为:

str2    -       e
2       -       b
3       -       c
1       -       a
str1    -       d

发现其实并不是按照顺序打印的:原因是pairs方法是根据key的hash值进行遍历的,不能保证顺序,但是却可以遍历table的全部key。

3、如果换成ipairs方法:

for k,v in ipairs(test_table) do
    print( k,"-",v )
end

结果为:

1       -       a
2       -       b
3       -       c

原因是ipairs方法,只会遍历key是整数,且从1开始key连续的数据(如果没有从1开始,或者不连续的key是不会遍历的)。换一种方式:

for i=1, #(test_table) do
    print(test_table[i])
end

和ipairs遍历结果一致,#(test_table)代表获取table的长度,不过:

test_table = {[1]="a",[2]="b",[3]="c",[5]="f",["str1"]="d",["str2"]="e"}
print(#(test_table))    --此处返回3,而不是6

#(test_table)也只会取key是整数,且从1开始key连续的数据(5虽然是整数key,但不连续)。

如果没有key为1的数据,则#(test_table)结果为0。

注意:

不要在lua的table中使用nil值,如果一个元素要删除,直接remove,不要用nil去代替。

原因看这里:http://www.jb51.net/article/64668.htm

5、table中删除元素:

table.remove(test_table)     --删除整数索引的最后一个
table.remove(test_table,pos)   --删除整数索引的第pos位置的

删除以后,后面的元素会向前移动。

6、如果table声明时不指定key:

test_table={"a","b","c","d","e"}

for k,v in ipairs(test_table) do
    print( k,"-",v )
end

这样其实是默认从1开始为key赋值,返回结果为:

1       -       a
2       -       b
3       -       c
4       -       d
5       -       e

7、如果出现了字符串key与整数key混搭的情况:

test_table={"a","b",["string1"]="str1","c","d","e","f",["string2"]="str2",string3="str3",[8]="h"}

for k,v in pairs(test_table) do    -- pairs遍历
    print( k,"-",v )
end

结果为:

1       -       a
2       -       b
3       -       c
4       -       d
5       -       e
6       -       f
8       -       h
string2 -       str2
string3 -       str3
string1 -       str1

可以看出这里key为string3的声明方式,直接使用了字面量,与["string3"]="str3"是相同的。

如果换做ipairs方式遍历结果为:

1       -       a
2       -       b
3       -       c
4       -       d
5       -       e
6       -       f

发现声明的[8]="h"并没有打印,因为前面的a、b、c、d、e、f整数索引是自动生成的,可以保证连续性,这里手工指定的并不连续。

8、如果手工赋值与自动生成整型key同时使用:

test_table={"a","b","c","d","e","f",[1]="x",[2]="x",[3]="x",[4]="x",[5]="x",[6]="x"}   

for k,v in pairs(test_table) do
    print( k,"-",v )     
end

pairs遍历结果:

1       -       a
2       -       b
3       -       c
4       -       d
5       -       e
6       -       f

可见手工赋值并没有起作用(虽然赋值是在最后)。

9、table的遍历

上面介绍了3种table的遍历方式:

--pairs (可以遍历全部元素,包括string型key)
for k,v in pairs(test_table) do   
    print( k,"-",v )
end
--ipairs(只能遍历整型key)
for k,v in ipairs(test_table) do   
    print( k,"-",v )
end
--计数(只能遍历整型key)
for i=1, 10 do
    print(test_table[i])
end

10、table连接:

test_table={"a","b","c",[4]="d",[5]="e",[6]="f",["str1"]="x2",str2="x1",[3]="x",[4]="x"}
print(table.concat(test_table))

table.concat 函数可以连接table中的数组部分的元素,上面程序执行的结果为:abcxef

其中d变为了x,是因为后面对4位置重新进行了赋值。但c因为是自动生成的整型key,所以没有被替换为x。

如果数组部分的key不连续,比如test_table后面又加了[8]="i"(但其实没有key=7的位置),这样使用table.concat就会报错,如:invalid value (nil) at index 7 in table for 'concat'

str1和str2的key没有被连接,是因为这里并不是整型key,不算做数组部分的元素。

11、table排序:

给定的table进行升序排序,其他排序可以通过比较器实现。

http://www.jb51.net/article/55718.htm 排序实例

12、table取最大值:

Lua5.2之后table.maxn方法已经不存在了:

http://www.cnblogs.com/liqiu/archive/2012/12/28/lua.html

 

 

分享到:
评论

相关推荐

    lua学习笔记.txt

    lua学习笔记

    lua学习笔记

    自己学习lua记得笔记,做任务用的~很基础的东西,想要的拿走,免费

    Lua学习笔记之表达式

    【Lua学习笔记之表达式】 在Lua编程语言中,表达式是构成程序的基本元素,用于表示计算或逻辑操作。表达式的结果可以是一个值,也可以是一个布尔值,这取决于执行的操作。下面我们将深入探讨Lua中的各种表达式类型...

    Lua学习笔记之类型与值

    Lua的类型与值的学习笔记为我们提供了对这些基础知识的全面了解,对于Lua新手来说是一份宝贵的资料。通过这些知识点的学习,开发者可以更加有效地编写Lua程序,并在日常开发中避免一些常见错误。

    Lua学习笔记之函数、变长参数、closure(闭包)、select等

    Lua是一种轻量级的脚本语言,具有易于嵌入到应用程序中、支持面向过程和函数式编程、拥有灵活的变量作用域等特点。本文将介绍Lua中函数的基础用法、变长参数、closure(闭包)、以及select函数的使用,并结合代码...

    lua基础学习笔记

    ### Lua基础学习笔记 #### 一、Lua简介与特点 Lua是一种轻量级且高效的脚本语言,广泛应用于游戏开发、网页应用、图形界面等领域。对于已有其他编程语言基础的学习者来说,掌握Lua通常较为迅速。Lua的设计哲学是...

    lua (vc环境)学习笔记(学习代码)

    **lua (VC环境) 学习笔记** 在深入学习lua编程语言并将其应用于Microsoft Visual C++(VC环境)时,我们需要了解几个关键知识点。lua是一种轻量级的脚本语言,设计目标是作为嵌入式语言,使得游戏开发、系统管理、...

    lua基础笔记

    在“lua基础笔记”中,我们可以探索以下关键知识点: 1. ** Lua语法基础 **:Lua的语法简洁明了,易于学习。变量声明不需要指定类型,其数据类型包括数字(浮点数和整数)、字符串、布尔值、表(类似数组或哈希表)...

    cocos2dx_lua开发笔记

    【cocos2dx_lua开发笔记】是一篇个人实践总结,主要涵盖了使用cocos2dx_lua进行游戏开发的一些关键点,包括...通过学习和理解这些笔记,开发者能够更好地理解和运用cocos2dx_lua进行游戏场景、UI元素和动画效果的构建。

    lua (vc环境)学习笔记

    【Lua (VC环境) 学习笔记】 Lua是一种轻量级的、开源的脚本语言,主要用于嵌入式系统和游戏开发。它以其简洁的语法、高效性和易于集成的特点受到广泛欢迎。在VC(Visual C++)环境中使用Lua,可以为C++应用程序提供...

    Lua的table元表自我学习笔记

    Lua的table元表自我学习笔记分享。--lua元表总结 --1、__index的运用 (调用table的一个不存在的索引时,会使用到元表的__index元方法,搜索元表是否也有改索引,__index可以是一个函数也可是一个table。)

    lua_example:lua 面向对象的例子

    Lua学习笔记v1.0 通过__《Programming in Lua》__和**《Lua程序设计》**以及网上关于Lua的相关资料,进行学习整理,总结出这一份学习笔记。为后面的初学者提供参考。 本资料针对的是Lua5.1版本,5.2版本以后语法和库...

    Lua使用笔记

    这个"Lua使用笔记"的压缩包包含了三个文件:hello3.lua、hello.lua和hello2.lua,这些文件很可能是 Lua 的示例代码或练习脚本,通过它们我们可以学习和理解 Lua 的基本语法和特性。 首先,我们来看一下 Lua 的基础...

    cocos2dx-lua 笔记

    《Cocos2d-x Lua 开发笔记》 在游戏开发领域,Cocos2d-x 是一个广泛应用的开源游戏引擎,以其高效、跨平台的特点深受开发者喜爱。而 Lua 语言作为 Cocos2d-x 的主要脚本语言,因其简洁、易学的特性,使得游戏逻辑...

    个人对c++使用lua的一些笔记

    Lua是一种轻量级的嵌入式脚本语言,它的语法简洁且易于学习,而C++则以其强大的性能和灵活性著称。将两者结合可以让我们在C++程序中利用Lua的便利性编写脚本,进行逻辑控制或动态行为。 一、Lua与C++的交互 1. Lua ...

    自我学习笔记--LUA;python:网络编程等

    【标题】中的“自我学习笔记--LUA;python:网络编程等”表明这是一份包含LUA和Python语言,特别是关于网络编程的学习资料。LUA和Python都是编程语言,广泛应用于游戏开发、脚本编写、自动化任务以及网络服务等领域。 ...

    Lua基础应用笔记

    ### Lua基础应用知识点详解 #### 一、Lua简介与特性 ...以上内容覆盖了Lua的基本语法和常用操作,是学习Lua的入门必备知识点。对于从事Unity3D开发或者对Lua感兴趣的朋友来说,掌握这些内容将极大地提高编程效率。

    基于Java与HTML/CSS/Lua的Spring实战书籍学习笔记与源码分析

    本项目为《Spring实战》英文原版书籍的Java实现学习笔记与源码分析,包含186个文件,主要采用Java语言编写,辅以HTML、CSS、Lua等语言。文件类型多样,涵盖163个Java源文件、5个HTML文件、2个Git忽略文件、2个...

Global site tag (gtag.js) - Google Analytics