首先,感谢 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. 流程控制:

  1. i =
  2. while(i < )
  3. do
  4. print(i)
  5. i = i +
  6. end
  1. x =
  2. if(x > )
  3. then
  4. print(x)
  5. end
  1. x =
  2. repeat
  3. print(x)
  4. x = x +
  5. until x ==
  1. for i=,, do --以步长为11递增到5
  2. print(i)
  3. end
  4.  
  5. a = {{,}, {, }, {, }}
  6. for i,v in ipairs(a) do
  7. print(i, v[], v[])
  8. end

5. 函数(其实也是变量)也可以用 local 修饰为局部

常规定义:

  1. function max(num1, num2) --函数声明-函数名-参数列表
  2. if(num1 > num2) then
  3. result = num1;
  4. else
  5. result = num2
  6. end
  7.  
  8. return result
  9. end
  10.  
  11. print(max(, ))
  12. print(max(, ))

多返回值:

  1. function max(num1, num2)
  2. if(num1 > num2) then
  3. result = num1;
  4. else
  5. result = num2
  6. end
  7. return , result
  8. end
  9.  
  10. _, a = max(, )
  11. _, b = max(, )
  12. print(a)
  13. print(b)

可变参数:

  1. function average(...)
  2. local args = {...}
  3. result =
  4.  
  5. for k,v in ipairs(args) do
  6. result = result + v
  7. end
  8.  
  9. result = result / #args
  10. return result
  11. end
  12.  
  13. print(average(,,,))

6. 字符串的表示:‘’、“”、[[ ]]。

7. 字符串常用处理api:

  1. str_test = "Hello Lua"
  2. print(str_test)
  3. pos = string.find(str_test, "Lua", ) --#3为开始检索的偏移
  4. print(pos)
  5.  
  6. str_test = string.format("I am learn Lua for %d hous.", )
  7. print(str_test)
  8. print(string.len(str_test))
  9.  
  10. print(str_test .. " It.s amazing.") --连接字符串
  11.  
  12. print(string.byte("Test", )) --将字符串的字符转为ascii
  13. print(string.char()) --将ascii转为字符

8. 数组用 {} 来定义。

  1. array = {{, }, {, }, {, }}
  2.  
  3. for i=, do
  4. for j = , do
  5. print(array[i][j])
  6. end
  7. end

9. 迭代器:ipairs,上面已经有使用。

10. table:数组不也是table么#83,只是它只存数字?

常用操作:

  1. fruits = {"apple", "banana", "orange"}
  2.  
  3. print(table.concat(fruits)) --将每个子项直接相连
  4. print(table.concat(fruits,", ")) --将子项之间通过", "相连
  5. print(table.concat(fruits, ", ", , )) --将前2项相连,舍弃第3
  6.  
  7. table.insert(fruits, "watermalon") --在末尾插入
  8. print(fruits[])
  9.  
  10. table.insert(fruits, , "pomelo") --在第2个位置插入
  11. print(fruits[])
  12.  
  13. table.remove(fruits, ) --移除第2个位置的项
  14. print(fruits[])
  15.  
  16. table.sort(fruits) --排序
  17. for k,v in ipairs(fruits) do
  18. print(v)
  19. end
  20.  
  21. table.sort(fruits, function (fruit_1, fruit_2) return string.len(fruit_1) > string.len(fruit_2) end) --自定义排序
  22. for k,v in ipairs(fruits) do
  23. print(v)
  24. end

之前写多了C#,这几天开始用 Lua,就老是把 C#的List 与 Lua的table 用混:

  C#:从 List 查找出的是数据的引用,用局部变量=引用,对该局部变量的任何修改,就是对 List 成员的修改。

  Lua:从 table 查找出的是数据的值,用局部变量=值,对该局部变量的任何修改,对 table 的成员是没有任何作用的。

table 是引用传递

11. 元表

设置元表与__index(类的成员定义、查找):

  1. other = { member_1 = "A", member_2 = "B" } --基础表元素
  2. entity_1 = setmetatable({ member_0 = "Words" }, { __index = other }) --添加元表
  3.  
  4. print(entity_1.member_0) --打印基础元素
  5. print(entity_1.member_1) --打印元表中的第一个元素
  6. print(entity_1.member_2) --打印元表中的第二个元素
  7.  
  8. entity_1 = setmetatable( entity_1, { --元表元素也可以是函数,一切都是变量
  9. __index = function(entity_1, key)
  10. if key == "key2" then
  11. return "metatablevalue"
  12. else
  13. return nil;
  14. end
  15. end })
  16.  
  17. 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元方法,来控制对元表元素的更新。

  1. mymetatable = {}
  2. mytable = setmetatable({key1 = "value_1"}, {__newindex = mymetatable}) --省略了 function(mymetatable, key, value)
  3.  
  4. print(mytable.key1)
  5.  
  6. mytable.newkey_1 = "newvalue_2"
  7. print(mytable.newkey_1, mymetatable.newkey_1) --nil, newvalue_2
  1. son_entity = { son_member = "son_value", __index = { son_metamember = "son_metavalue"},
  2. __newindex = function(table, key, value)
  3. print(key.." is not exist.")
  4. end
  5. }
  6.  
  7. parent_entity = { parent_member = "parent_value" }
  8. setmetatable(parent_entity, son_entity)
  9.  
  10. print(parent_entity.parent_member)
  11. print(parent_entity.son_member)
  12. print(parent_entity.son_metamember)
  13. parent_entity.newkey =
  14. --output: parent_valuenilson_metavaluenewkey is not exist

如果__newindex是一个函数,则在给table不存在的字段赋值时,会调用这个函数。
如果__newindex是一个table,则在给table不存在的字段赋值时,会直接给__newindex的table赋值。

运算符重写:

__add、__sub、__mul、__div、__mod、__unm、__concat、__eq、__lt、__le,这些运算符可重写。

  1. entity_1 = setmetatable( {, , }, {
  2. __add = function(genericT, num)
  3. for k, v in ipairs(genericT) do
  4. genericT[k] = v + num
  5. end
  6. return genericT
  7. end
  8. })
  9.  
  10. --[[
  11. entity_1 = setmetatable( {1, 2, 3}, {
  12. __add = function(genericT, num)
  13. for k, v in ipairs(genericT) do
  14. v = v + num --最初的写法是这样
  15. print(v) --这里打印的数据会被修改,但并不会真正改到 entity_1
  16. end --可见lua的迭代器是值传递,还不是C#的引用传递
  17. return genericT
  18. end
  19. })
  20. ]]--
  21.  
  22. entity_1 = entity_1 +
  23.  
  24. for k, v in ipairs(entity_1) do
  25. print(v)
    end

元方法(构造函数)

定义方法 __call:

  1. person = { name = ""}
  2. person = setmetatable( person, {
  3. __call = function(person, newname)
  4. person.name = newname
  5. end
  6. })
  7.  
  8. person("Luakid")
  9. print(person.name)

Lua:简单入门的更多相关文章

  1. lua简单入门

    一.安装windows下的lua环境,luaforwindows 下载最新的5.3版本,下载地址: https://sourceforge.net/projects/luabinaries/files ...

  2. Lua简易入门教程

    环境:lua for windows (lfW)主页:http://luaforwindows.luaforge.net/https://code.google.com/p/luaforwindows ...

  3. 用IntelliJ IDEA创建Gradle项目简单入门

    Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...

  4. [原创]MYSQL的简单入门

    MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...

  5. Okio 1.9简单入门

    Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...

  6. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  7. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  8. Docker 简单入门

    Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737

  9. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

  10. git简单入门

    git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...

随机推荐

  1. 《Qt编程的艺术》——8.2.1 在Designer中使用View类

    不幸的是,QDirModel有一个严重的限制:因为view不响应鼠标操作,我们不得不自己建立这些功能.除此之外,每个view中,用户都一次只能选择一个元素.如果你想要允许同时选择多个项目,你也必须自己 ...

  2. SpringBoot 配置文件 application.properties(二)

    mvc spring.mvc.async.request-timeout设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体实现的超时时间为准,比如tomcat的servlet3的话是 ...

  3. sql第一课笔记

    这是我看了imooc的视频教程之后重新写的笔记. 虽然之前也是学习过SQL Server数据库,但是也是忘记得差不多了.现在重新捡起来,安装一次数据库练习,使用的是mysql. 第一课是最简单的创建, ...

  4. 《Java 并发编程实战》读书笔记之二:图文讲述同步的另一个重要功能:内存可见性

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另 ...

  5. mongoDb 给表添加+ 删除字段

    1 .添加一个字段.  url 代表表名 , 添加字段 content. 字符串类型. db.url.update({}, {$set: {content:""}}, {multi ...

  6. VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池

    VMware vSphere 服务器虚拟化之二十五 桌面虚拟化之终端服务池 终端服务池是指由一台或多台微软终端服务器提供服务的桌面源组成的池.终端服务器桌面源可交付多个桌面.它具有以下特征: 1.终端 ...

  7. Note | javascript权威指南[第六版] 第2章:词法结构

      语法结构规定了诸如变量名是什么样的.怎么写注释,以及程序语句之间如何分隔等规则.本章用很短的篇幅来介绍JavaScript的词法结构.   2.1.字符集   JavaScript程序是用Unic ...

  8. 如何设置jsp默认的编码为utf-8

    方法一: 文件里写: <%@ page contentType="text/html; charset=UTF-8"  %> 方法二: 选择window –> P ...

  9. [转] Boost智能指针——scoped_ptr

    http://www.cnblogs.com/tianfang/archive/2008/09/15/1291050.html boost::scoped_ptr和std::auto_ptr非常类似, ...

  10. C++对象模型学习笔记

    1. 全局变量是如何初始化的 //global var A a; int main() { cout<<a<<endl; ; } 如上述例子,全局变量a是在main()函数之前 ...