Lua:简单入门
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Lua:简单入门,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4442字,纯文字阅读大概需要7分钟。
内容图文
![Lua:简单入门](/upload/InfoBanner/zyjiaocheng/1061/fbb18f6214cc44209ef78052b3e91a37.jpg)
首先,感谢 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 = 0while(i < 5) doprint(i) i = i + 1end
x = 1if(x > 0) thenprint(x) end
x = 1repeatprint(x) x = x + 1until x == 5
for i=1,5,1do--以步长为1从1递增到5print(i) end a = {{1,2}, {2, 4}, {3, 6}} for i,v inipairs(a) doprint(i, v[1], v[2]) end
5. 函数(其实也是变量)也可以用 local 修饰为局部
常规定义:
function max(num1, num2) --函数声明-函数名-参数列表if(num1 > num2) then result = num1; else result = num2 endreturn result endprint(max(1, 3)) print(max(5, 8))
多返回值:
function max(num1, num2) if(num1 > num2) then result = num1; else result = num2 endreturn2, result end _, a = max(1, 3) _, b = max(5, 6) print(a) print(b)
可变参数:
function average(...) local args = {...} result = 0for k,v inipairs(args) do result = result + v end result = result / #args return result endprint(average(1,4,5,10))
6. 字符串的表示:‘’、“”、[[ ]]。
7. 字符串常用处理api:
str_test = "Hello Lua"print(str_test) pos = string.find(str_test, "Lua", 1) --#3为开始检索的偏移print(pos) str_test = string.format("I am learn Lua for %d hous.", 2) print(str_test) print(string.len(str_test)) print(str_test .. " It.s amazing.") --连接字符串print(string.byte("Test", 1)) --将字符串的字符转为asciiprint(string.char(99)) --将ascii转为字符
8. 数组用 {} 来定义。
array = {{1, 2}, {2, 4}, {4, 8}} for i=1,3dofor j = 1,2doprint(array[i][j]) endend
9. 迭代器:ipairs,上面已经有使用。
10. table:数组不也是table么#83,只是它只存数字?
常用操作:
fruits = {"apple", "banana", "orange"} print(table.concat(fruits)) --将每个子项直接相连print(table.concat(fruits,", ")) --将子项之间通过", "相连print(table.concat(fruits, ", ", 1, 2)) --将前2项相连,舍弃第3项table.insert(fruits, "watermalon") --在末尾插入print(fruits[4]) table.insert(fruits, 2, "pomelo") --在第2个位置插入print(fruits[2]) table.remove(fruits, 2) --移除第2个位置的项print(fruits[2]) table.sort(fruits) --排序for k,v inipairs(fruits) doprint(v) endtable.sort(fruits, function (fruit_1, fruit_2) returnstring.len(fruit_1) > string.len(fruit_2) end) --自定义排序for k,v inipairs(fruits) doprint(v) end
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"thenreturn"metatablevalue"elsereturnnil; endend }) 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 = 1--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( {1, 2, 3}, { __add = function(genericT, num) for k, v inipairs(genericT) do genericT[k] = v + num endreturn 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 + 5for k, v inipairs(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)
原文:http://www.cnblogs.com/Daniel-Liang/p/5843305.html
内容总结
以上是互联网集市为您收集整理的Lua:简单入门全部内容,希望文章能够帮你解决Lua:简单入门所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。