2020-09-16 学习笔记1

参考Lua的菜鸟教程,这里写下来是方便自己查阅。

Lua的关键字

以下列出了 Lua 的保留关键字。保留关键字不能作为常量或变量或其他用户自定义标示符:

and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while goto

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

Lua的注释

使用 -- 做单行注释

使用 --[[ --]]做多行注释

Lua 数据类型

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型 描述
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean 包含两个值:false和true。
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

我们可以使用 type 函数测试给定变量或者值的类型:

print(type("Hello"))

注意字符串可以使用单引号、双引号、或者[[ ]]。最后一个类似于Python的三引号字符串。

--table类型用花括号包裹,如下
t = {1, '5', ["sss"] = 52, 's'}
--其中可以直接是值或者变量,也可以是键值对的形式,注意索引的时候下标是从1开始的
--且键值对不能使用下标访问
t[1] --是1
t[3] --是's'
t["sss"] --是52

--下面的例子是如果为一个不存在的索引赋值,将会创建该索引
a = {}
a[5] = 5
a["zzz"] = "zun"
print(a[5])  --输出5
print(a["zzz"])  --输出"zun"
print(a.zzz)  --输出"zun" table中的键值可以使用'.'来访问
--如果给table中的位置,或者键赋值为nil则表示从table中删除他们,同样全局变量也可以如此删除

lua的字符串使用 '..'连接不是使用加号。

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束。

for i = 0, 5, 2
do
    local a = 50
end
print(a) --打印为nil 因为a是local的,如果去掉local修饰这里就会打印50,所以lua要注意只要没哟local修饰就都是全局变量,不是是声明在循环体内部还是函数内部
function abs() 
    c = 2
end
abs()
print(c) --打印为2,当然如果函数不调用一下的话c还是未定义的

应该尽可能的使用局部变量,有两个好处:

    1. 避免命名冲突。
    1. 访问局部变量的速度比全局变量更快。

循环

Lua中的循环

a=10
while( a < 20 ) --实测这个小括号不是必须的去掉也可以
do  --do 不能忘
   print("a 的值为:", a) --缩进只是为了好看不想Python是用来区分语句块的
   a = a+1 --亲测a++、a += 1 都没用会报错看来都不支持
end

Lua 编程语言中数值 for 循环语法格式:

for var=exp1,exp2,exp3 do  
    <执行体>  
end  

var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 "执行体",也就是说如果exp3是一个函数的返回值的话这个函数只会被执行一次。exp3 是可选的,如果不指定,默认为1,当然可以设置为负数,这样每次都是递减。

for i=10,1,-1 do --加上小括号是不行的会报错,同样do也不能去掉,注意变为1 的时候仍然执行
    print(i)
end
print(i) --打印nil 表明在for里面声明的i变量是local的

Lua 编程语言中 repeat...until 循环语法格式:

repeat
   statements
until( condition )

我们注意到循环条件判断语句(condition)在循环体末尾部分,所以在条件进行判断前循环体都会执行一次。

这就是do..while了。

a = 10
repeat
   print("a的值为:", a)
   a = a + 1
until a > 15 --同样不加小括号也可以,最好还是加上看起来不费劲

控制

a = 2
if (a == 1) --要不要括号都行最好带上便于阅读,但是then不能缺
then
    print(a)
elseif a == 2
then  --这个then也不能缺
    print("a is 2")
else  --这里就不需要then了
    print("This is else.")
end

函数

定义格式如下:

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

解析:

  • optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local
  • function_name: 指定函数名称。
  • argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
  • function_body: 函数体,函数中需要执行的代码语句块。
  • result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)

   if (num1 > num2) then
      result = num1;  --心累,这语言才发现加上 ; 结尾一个语句和不加都可以运行
   else
      result = num2;
   end

   return result;
end
-- 调用函数
print("两值比较最大值为 ",max(10,4));
print("两值比较最大值为 ",max(5,6));
myprint = function(param)
   print("这是打印函数 -   ##",param,"##")
end

function add(num1,num2,functionPrint) --所以参数其实传入什么都可以,只要可以在函数内使用正确就行
   result = num1 + num2
   -- 调用传递的函数参数
   functionPrint(result)
end
myprint(10)
-- myprint 函数作为参数传递
add(2,5,myprint)

函数也可以有多个返回值,只要使用','隔开就好。

Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数。

  function add(...)  --可以在函数内使用 a = {...}的语句将可变参数赋值给变量,这样就可以操作这个变量来获取,诸如访问每一个参数,获取程度等操作
  local s = 0  
    for i, v in ipairs{...} do   --> {...} 表示一个由所有变长参数构成的数组  
      s = s + v  
    end  
    return s  
  end  
  print(add(3,4,5,6,7))  --->25

我们可以将可变参数赋值给一个变量。

通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select('#', …) 或者 select(n, …)

  • select('#', …) 返回可变参数的长度

  • select(n, …) 用于返回 nselect('#',…) 的参数。select(n, ...) --数字n表示起点,select(n, ...)返回从起点n到结束的可变参数,比如:

    n=3,... 是 0,1,2,3,4,5

    则 select(n, ...) 就表示...中从第3个到最后一个的多个数:2,3,4,5。并且2,3,4,5是4个数,不是列表或其他的数据结构。所以, 下面的代码中,a = select(3,...) 就表示的是 a = 2,3,4,5。这就相当于复制变量大于值的情况,所以,a=2。

调用select时,必须传入一个固定实参selector(选择开关)和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参,否则只能为字符串"#",这样select会返回变长参数的总数。

function mytest(a, ...) --可变实参和普通参数可以混用
    local t = select('#', ...) --获取可变实参的长度
    print(t)
    local b = {...}--将可变实参传递给变量,然后通过变量访问其内容,但是这样如果访问越界不会报错
    print(b[1])
end
mytest(5, 6, 7, 8)
do  
    function foo(...)  
        for i = 1, select('#', ...) do  -->获取参数总数
            local arg = select(i, ...); -->读取参数 采取这样的方式可以读取可变实参而不会越界
            print("arg", arg);  
        end  
    end  
 
    foo(1, 2, 3, 4);  
end
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349