关于Lua基本语法学习记录

循环

  1. while
  2. for
  3. repeat … until
  4. 支持 break

流程控制

  1. lua 中 0 为 true, 只有 boolean 类型中的 false 和 nil 为 false

  2. 语法

    if (0)
    then 
      print('hello')
    end
    

函数

主要的两种用途

  1. 完成指定的任务
  2. 计算并返回值

函数的定义

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end

-- optional_function_scope 全局 or local 默认全局
-- 返回值可以用逗号分割

注意点

  1. 函数可以作为参数传递给函数

  2. 多返回值

  3. 支持可变参数

    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("总共传入 " .. #arg .. " 个数")
       return result/#arg
    end
    
    print("平均值为",average(10,5,3,4,5,6))
    

运算符

分类

  1. 算数运算符
  2. 关系运算符
    1. ~= 不等于
  3. 逻辑运算符
    1. and or not
  4. 其他运算符
    1. .. 连接两个字符串
    2. # 一元计算符,返回字符串或者表的长度

优先级

^
not -
* /
+ -
..
< > <= >= ~= ==
and
or

除了 ^ 和 .. 之外都是左连接


字符串

三种表达方式

  • 单引号
  • 双引号
  • [[]] 之间的字符

字符串操作

方法 用途
string.upper
string.lower
string.gsub(mainString, findString, replaceString, num) 在字符创中替换
string.strfind(str, substr, [init, [end]]) 搜索子串位置,不存在返回nil
string.reverse(arg)
string.format(...) string.format('this is value: %d', 4)
string.char(arg) / string.byte(arg, [int]) char 将整形数字转成字符并连接;byte 转换字符为整数型,可以指定某个字符,默认是第一个字符
string.len()
string.rep() 返回字符串的 string 的n个拷贝
.. 连接两个字符串

数组

相同数据类型的元素按一定的顺序排列的集合,可以是一维数组和多维数组

一维数组

线性表

array = {'lua', 'hello'}

for i=0, 2 do
  print(array[i])
end

-- nil
-- lua
-- hello

lua 的索引值是从1开始的,但是也可以指定0开始


迭代器(iterator)

在 lua 中迭代器是一种支持指针类型的结果,它可以遍历集合中的每一个元素

关于无状态迭代器和多状态迭代器


table(表)

使用关联数组,可以用任意类型的值来做数组的索引,但是不能是nil

是不固定大小的,可以根据需要扩容

lua 也是通过 table 来解决模块、包和对象的

table的操作

方法 用途
table.concat(table, [, sep [, start [, end]]]) table 的数组部分从 start 到 end 位置的所有元素,元素之间可以指定分隔符 sep
table.insert(table, [pos], value) pos 默认尾部
table.remove(table, [,pos]) pos 默认尾部
table.sort(table, [, comp]) 对给定的table进行升序排序

模块与包

Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。以下为创建自定义模块 module.lua,文件代码格式如下

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
 
-- 定义一个常量
module.constant = "这是一个常量"
 
-- 定义一个函数
function module.func1()
    io.write("这是一个公有函数!\n")
end
 
local function func2()
    print("这是一个私有函数!")
end
 
function module.func3()
    func2()
end
 
return module

require函数

用来加载模块,例如

执行 require 之后会返回一个有模块常量或函数组成的table, 并还会定义一个包含该 table 的全局变量

require("<模块名>")
require "<模块名>"

-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
 
print(module.constant)
 
module.func3()

-- test_module2.lua 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
 
print(m.constant)
 
m.func3()

加载机制

  1. 它会尝试从 lua 文件或者 C 程序库中加载模块

  2. 搜索 lua 文件的路径是存放在全局变量 package.path 中,当 lua 启动之后,会以环境变量 LUA_PATH的值来初始化这个环境变量。如果没有找到这个环境变量,在使用编译时定义的默认路径来初始化

  3. LUA_PATH可以自定义设置,例如:

    #LUA_PATH
    export LUA_PATH="~/lua/?.lua;;"
    
    # 文件路径是以 ; 来分割,最后的两个 ;; 标示新家的路径后边加上原来的默认路径
    

C 包

与Lua中写包不同,C包在使用以前必须首先加载并连接,在大多数系统中最容易的实现方式是通过动态连接库机制。

Lua在一个叫loadlib的函数内提供了所有的动态连接的功能。这个函数有两个参数:库的绝对路径和初始化函数。所以典型的调用的例子如下:

local path = "/usr/local/lua/lib/libluasocket.so"
local f = loadlib(path, "luaopen_socket")

元表(metatable)

改变表的行为,每个行为关联了对应的原方法

处理元素重要的两个函数

  1. setmetatable(table, metatable)
  2. getmetatable(table)

__index:类似 php 中的 __get()方法,lua查找一个表元素的规则:

  1. 在表中查找,如果找到,返回该元素,找不到继续
  2. 判断该表是否有元表,如果没有元表,返回 nil,有元表则继续
  3. 判断元表中是否有__index方法,如果 __index 为 nil, 则返回nil; 如果是一个表,则重复1,2,3;如果是一个函数,则返回该函数的返回值

__newindex:用来对表更新,__index 则用来对表访问

为表添加操作符

  • __add
  • __sub
  • __nul
  • __div
  • __mod
  • __umn: 对应的操作符:-
  • __contact
  • __eq
  • __lt
  • __gt

__call

__tostring


协同程序(coroutine)

Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

线程和协同程序区别

线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同

基本语法

方法 描述
coroutine.create() 创建,返回,参数是一个函数
coroutine.resume() 重启、唤醒coroutine,和create() 配合使用
coroutine.yield() 挂起
coroutine.status() dead\suspend\running
coroutine.wrap() 和 create() 功能重复
corouting.running() 返回正在运行的coroutine的线程号

参考

Lua 教程|菜鸟教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容

  • 1.1程序块:Lua执行的每段代码,例如一个源代码文件或者交互模式中输入的一行代码,都称为一个程序块 1.2注释:...
    c_xiaoqiang阅读 2,585评论 0 9
  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,626评论 1 7
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,327评论 0 17
  • 1 人生苦短,岁月无常,这是我从高二开始每天念叨的一句话。有一段时间,仿佛俨然成了我的座右铭。与任何同学说话、谈论...
    CathyArmstrong阅读 154评论 0 0
  • 开心的时候就笑一笑 不开心的时候就闹一闹 没有什么大不了 人生短暂几十年 唯有快乐 不枉此生
    快乐的Alina阅读 186评论 0 4