Lua:简单入门
首先,感谢 runoob.com:http://www.runoob.com/lua/lua-tutorial.html
直接用 SciTE 进行文本编辑,F5调试,非常方便。
注意点:
1. 变量的作用域:全局变量、局部变量- local 声明,do - end 可以用于划分作用域。
2. 对多个变量赋值要逐个赋值,不可 a, b, c = 0。必须是 a, b, c = 0, 0, 0。
3. 运算符居然不能用 “++”、“+=”,其他都跟C/C++类似。
4. 流程控制:
i =
while(i < )
do
print(i)
i = i +
end
x =
if(x > )
then
print(x)
end
x =
repeat
print(x)
x = x +
until x ==
for i=,, do --以步长为1从1递增到5
print(i)
end a = {{,}, {, }, {, }}
for i,v in ipairs(a) do
print(i, v[], v[])
end
5. 函数(其实也是变量)也可以用 local 修饰为局部
常规定义:
function max(num1, num2) --函数声明-函数名-参数列表
if(num1 > num2) then
result = num1;
else
result = num2
end return result
end print(max(, ))
print(max(, ))
多返回值:
function max(num1, num2)
if(num1 > num2) then
result = num1;
else
result = num2
end
return , result
end _, a = max(, )
_, b = max(, )
print(a)
print(b)
可变参数:
function average(...)
local args = {...}
result = for k,v in ipairs(args) do
result = result + v
end result = result / #args
return result
end print(average(,,,))
6. 字符串的表示:‘’、“”、[[ ]]。
7. 字符串常用处理api:
str_test = "Hello Lua"
print(str_test)
pos = string.find(str_test, "Lua", ) --#3为开始检索的偏移
print(pos) str_test = string.format("I am learn Lua for %d hous.", )
print(str_test)
print(string.len(str_test)) print(str_test .. " It.s amazing.") --连接字符串 print(string.byte("Test", )) --将字符串的字符转为ascii
print(string.char()) --将ascii转为字符
8. 数组用 {} 来定义。
array = {{, }, {, }, {, }}
for i=, do
for j = , do
print(array[i][j])
end
end
9. 迭代器:ipairs,上面已经有使用。
10. table:数组不也是table么#83,只是它只存数字?
常用操作:
fruits = {"apple", "banana", "orange"}
print(table.concat(fruits)) --将每个子项直接相连
print(table.concat(fruits,", ")) --将子项之间通过", "相连
print(table.concat(fruits, ", ", , )) --将前2项相连,舍弃第3项
table.insert(fruits, "watermalon") --在末尾插入
print(fruits[])
table.insert(fruits, , "pomelo") --在第2个位置插入
print(fruits[])
table.remove(fruits, ) --移除第2个位置的项
print(fruits[])
table.sort(fruits) --排序
for k,v in ipairs(fruits) do
print(v)
end
table.sort(fruits, function (fruit_1, fruit_2) return string.len(fruit_1) > string.len(fruit_2) end) --自定义排序
for k,v in ipairs(fruits) do
print(v)
end
之前写多了C#,这几天开始用 Lua,就老是把 C#的List 与 Lua的table 用混:
C#:从 List 查找出的是数据的引用,用局部变量=引用,对该局部变量的任何修改,就是对 List 成员的修改。
Lua:从 table 查找出的是数据的值,用局部变量=值,对该局部变量的任何修改,对 table 的成员是没有任何作用的。
table 是引用传递!
11. 元表
设置元表与__index(类的成员定义、查找):
other = { member_1 = "A", member_2 = "B" } --基础表元素
entity_1 = setmetatable({ member_0 = "Words" }, { __index = other }) --添加元表
print(entity_1.member_0) --打印基础元素
print(entity_1.member_1) --打印元表中的第一个元素
print(entity_1.member_2) --打印元表中的第二个元素
entity_1 = setmetatable( entity_1, { --元表元素也可以是函数,一切都是变量
__index = function(entity_1, key)
if key == "key2" then
return "metatablevalue"
else
return nil;
end
end })
print(entity_1.key2)
__index:当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
Lua查找一个表元素时的规则,其实就是如下3个步骤:
- 1.在表中查找,如果找到,返回该元素,找不到则继续
- 2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
- 3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。
__newindex(更新成员):
调用__newindex元方法,来控制对元表元素的更新。
mymetatable = {}
mytable = setmetatable({key1 = "value_1"}, {__newindex = mymetatable}) --省略了 function(mymetatable, key, value)
print(mytable.key1)
mytable.newkey_1 = "newvalue_2"
print(mytable.newkey_1, mymetatable.newkey_1) --nil, newvalue_2
son_entity = { son_member = "son_value", __index = { son_metamember = "son_metavalue"},
__newindex = function(table, key, value)
print(key.." is not exist.")
end
}
parent_entity = { parent_member = "parent_value" }
setmetatable(parent_entity, son_entity)
print(parent_entity.parent_member)
print(parent_entity.son_member)
print(parent_entity.son_metamember)
parent_entity.newkey =
--output: parent_value、nil、son_metavalue、newkey is not exist
如果__newindex是一个函数,则在给table不存在的字段赋值时,会调用这个函数。
如果__newindex是一个table,则在给table不存在的字段赋值时,会直接给__newindex的table赋值。
运算符重写:
__add、__sub、__mul、__div、__mod、__unm、__concat、__eq、__lt、__le,这些运算符可重写。
entity_1 = setmetatable( {, , }, {
__add = function(genericT, num)
for k, v in ipairs(genericT) do
genericT[k] = v + num
end
return genericT
end
})
--[[
entity_1 = setmetatable( {1, 2, 3}, {
__add = function(genericT, num)
for k, v in ipairs(genericT) do
v = v + num --最初的写法是这样
print(v) --这里打印的数据会被修改,但并不会真正改到 entity_1
end --可见lua的迭代器是值传递,还不是C#的引用传递
return genericT
end
})
]]--
entity_1 = entity_1 +
for k, v in ipairs(entity_1) do
print(v)
end
元方法(构造函数)
定义方法 __call:
person = { name = ""}
person = setmetatable( person, {
__call = function(person, newname)
person.name = newname
end
})
person("Luakid")
print(person.name)
Lua:简单入门的更多相关文章
- lua简单入门
一.安装windows下的lua环境,luaforwindows 下载最新的5.3版本,下载地址: https://sourceforge.net/projects/luabinaries/files ...
- Lua简易入门教程
环境:lua for windows (lfW)主页:http://luaforwindows.luaforge.net/https://code.google.com/p/luaforwindows ...
- 用IntelliJ IDEA创建Gradle项目简单入门
Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...
- [原创]MYSQL的简单入门
MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...
- Okio 1.9简单入门
Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...
- emacs最简单入门,只要10分钟
macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...
- 【java开发系列】—— spring简单入门示例
1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...
- Docker 简单入门
Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- git简单入门
git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...
随机推荐
- POJ 1417 True Liars
题意:有两种人,一种人只会说真话,另一种人只会说假话.只会说真话的人有p1个,另一种人有p2个.给出m个指令,每个指令为a b yes/no,意思是,如果为yes,a说b是只说真话的人,如果为no,a ...
- B - Frogger
题目大意: 一个叫做弗雷迪的青蛙坐在湖中间的一块石头上.突然他注意到他的青蛙女神菲奥娜坐在另一块石头上面,于是他计划去看她,但是呢湖里面的水很脏并且充满了游客的防晒霜,所以他想避免游泳而采用跳跃的方式 ...
- G - Shuffle'm Up
题目大意: 是一个洗牌游戏,首先给出两堆牌,s1,s2,先从s1上面拿一张牌再从s2上面拿一张牌依次往下可以洗好牌,然后把洗好的牌再分成两堆继续洗,直到这堆牌的顺序与给的顺序相同可以停止,当然如果洗不 ...
- Git push本地代码到新建远程仓库
快速搞定 1.git init #初始化本地仓库 2.git remote add origin https://git.oschina.net/redArmy/springboot-swagger ...
- android获取apk签名信息
因为工作需要,需要获取应用的apk传递给新浪微博或者微信去申请授权 所以需要程序内获取签名上传服务器 做法如下: public static String getAPPSecretString(A ...
- 如何在myeclipse8.5中使用maven
今天搞了一天才搞清楚这个问题,一直导入不了mavendependencies,后来发现是 13-11-23 下午06时47分11秒: Downloading http://mirrors.ibibli ...
- 多版本号并发控制(MVCC)在分布式系统中的应用
QQ群:289150599 问题 近期项目中遇到了一个分布式系统的并发控制问题.该问题能够抽象为:某分布式系统由一个数据中心D和若干业务处理中心L1,L2 ... Ln组成:D本质上是一个key-va ...
- 全球最低功耗蓝牙单芯片(DA14580)系统架构和应用开发框架分析
DA14580是Dialog公司研制的蓝牙单芯片,号称全球功耗最低,是TI CC2541的四分之一,是运动手环等穿戴类电子产品的常用芯片.但是DA14580的开发门槛不低,适合有蓝牙开发经验的团队来开 ...
- c++回调编程本质
1. boost:bind获得一个函数对象,就像函数指针一样,这个行为可以作为回调 2. bosot:bind的函数对象可以保存别的对象的引用,回调对象的成员函数 3. boost:function是 ...
- Day9 - Python 多线程、进程
Python之路,Day9, 进程.线程.协程篇 本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线 ...