lua学习<基础概念>

基础概念

程序块 (chunk)

定义

  1. lua 中的每一个源代码文件或在交互模式(Cmd)中输入的一行代码都称之为程序块
  2. 一个程序块就是一连串语句或者命令
  3. lua 中连续的语句不需要分隔符,但为了可读性可以加换行,或者分隔符分号 ; 来分割语句
  4. 但是换行在代码中没有任何作用,仅仅是为了提高可读性
a = 1
b = a * 2

a = 1;
b = a * 2

a = 1; b = a * 2
a = 1 b = a * 2

一个程序块可以仅包含一条语句,也可以由多条不同的语句或函数的定义构成

  1. 程序块可以是任意大小的
  2. 可以将程序块保存在文件中然后再执行
  3. 也可以将程序块放到交互模式中运行解释器

当使用任何参数直接运行解释器时会看到这样得提示符

Lua 5.1.5 Copyright (C) 1994-2012 Lua.org Puc-Rio
>
  1. 再这种模式下输入得每条命令都将立即被执行
  2. 要退出交互模式和解释器
    1. 可以调用操作系统库的 exit 函数,输入 os.exit()
    2. 或者 end-of-file 控制字符,在 DOS/Windows 中是 Ctrl + Z
  3. 在交互模式中解释器通常将所输入的内容当作一个完整的程序块来解释
  4. 如果解释器检测到某行所输入的内容不足以构成一个完整的程序块,那么它就会等待输入
  5. 这种机制的存在使得我们可以在交互模式中输入某些函数的多行定义

但将多行内容放入文件中才是更常见的做法

  1. 然后在交互模式中通过调用解释器来执行文件
-- fact.lua 阶乘文件
function fact(n)
    if n == 0 then
        return 1  --0的阶乘是1
    else 
        return n * fact(n - 1)  --输入3会执行 3 * 2 * 1
    end
end
print("Enter a number:")
a = io.read("*number")
print(fact(a))

-i 参数

  1. 通过 -i 参数来启动解释器
  2. lua -i prog
  3. 这样会先运行文件 prog 中的程序块后再进入交互模式

读取用户输入并指定格式

  1. io.read("*number") 读取数字格式

dofile 函数

  1. 立即执行一个函数文件
  2. 运行后如果无报错
  3. 相当于加载了这个lua 文件中的函数库
  4. 就可以在后续的交互模式中直接调用这个函数库里定义的方法
  5. 方便测试新的代码,在代码编辑器中修改后在交互模式中执行dofile即加载修改后新的代码
  6. 使用 dofile 后里面字符串文件路径的 \ 记得再用一次 \ 进行转义
  7. 如:dofile("d:\demo\a.lua")
-- lib1.lua
-- 计算两个数的平方和在开平方根
function norm(x, y)
    return (x ^ 2 + y ^ 2) ^ 0.5
end
-- 计算某数的两倍
function twice(n)
    return n * 2
end
> dofile("lib1.lua") -- 加载你编写的程序库,需要填完整的文件路径
> n = norm(3.14, 1.0)
> print(twice(4)) -- 8

词法规范

标识符

  1. 可以由任意字母、下划线、数字构成的字符串
  2. 但不可以由数字开头

避免使用以一个下划线开头之后跟着一个或多个大写字母的标识符

  1. lua 会将这些标识符保留,用作特殊用途
  2. 如 _VERSION, _PROMPT
  3. 因为这是 lua 中的哑变量

区域设置(Locale)

  1. 在 lua 中什么是字母的概念依赖于区域设置(Locale)
  2. 如果设置了对应的区域如希腊,就可以使用希腊字母作为变量名了
  3. 但这样的变量可能无法在不支持该区域的系统上运行

保留字

  1. and
  2. break
  3. do
  4. else
  5. elseif
  6. end
  7. false
  8. for
  9. function
  10. id
  11. in
  12. local
  13. nil
  14. not
  15. or
  16. repeat
  17. return
  18. then
  19. true
  20. until
  21. while

lua中区分大小写,如 "And" "AND" 是可以作为变量的,且与保留字 and 完全不同

注释的写法

  1. 单行注释:--code block
  2. 多行注释:--[[ code block ]]
  3. 一旦写了注释后面的代码将不会起作用,解释器会将其忽略
  4. 小技巧:建议这样写多行注释 --[[ code block --]]
  5. 可以在块注释前加一个连字符 - 即可启用代码块中的代码
--[[
    print(222)
    print(666) --都不起作用(因为块注释注释掉了其中的代码)
--]]

-- 常规写法加一个连字符写块注释
---[[
    print(222)
    print(666) --会报错
]]

-- 推荐写法加一个连字符写块注释
-- 因为这样写的话,第一行和最后一行就变成了两个彼此独立的单行注释
---[[
    print(222)
    print(666)
--]]

全局变量

  1. 全局变量不需要声明
  2. 只需要将一个值赋给这个全局变量即可创建
  3. 在 lua 中访问一个未初始化的变量并不会发生错误
  4. 但访问的结果是一个特殊的值 nil ,也就是空值
  5. 删除全局变量,将它赋值为 nil
print(b) -- nil
b = 10
print(b) -- 10

-- 删除全局变量
b = nil 
print(b) -- nil

解释器程序

  1. [] 代表可选项
  2. lua [选项参数] [脚本[参数]]
  3. 不使用参数会直接进入交互模式
  4. -e 直接在命令行中输入代码
  5. 如果只有 -e ,没有 -i 那么就不会进入交互模式,而是运行后直接结束
  6. -l 用于加载库文件

_PROMPT

  1. 修改这个全局变量,就会修改交互模式下的命令提示符
  2. 外面的双引号用于阻止 shell 误解内层的单引号
lua -i -e "_PROMPT = 'lua>'"
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
lua>

在交互模式中打印任何表达式的值

  1. print()
  2. 也可以使用等号开头后面跟一个表达式 =

在解释器执行其参数前

  1. 先会寻找一个 LUA_INIT 的环境变量
  2. 如果找到了,并且它的内容为 @文件名 的话
  3. 解释器就会先执行这个文件
  4. 如果 LUA_INIT 没有以 @ 开头,解释器就假设变量内容为 lua 代码,并运行这段 lua 代码
  5. LUA_INIT 可以灵活地配置解释器,并且可以完全控制如何配置它
  6. 比如:可以预先加载一个程序包(Package)、修改命令提示符和路径、定义函数、对函数进行改名或删除等。

运行脚本前的参数

  1. 在脚本代码中,可以通过全局变量 arg 来检索脚本的启动参数
  2. 解释器在运行脚本前,会用所有的命令行参数创建一个名为 arg 的 table
  3. 脚本名称位于索引 0 上
  4. 它的第一个参数(示例中的 a) 位于索引1 ,以此类推
  5. 而在 脚本文件(示例中的 script ) 之前的的所有选项参数位于负数索引上
lua 脚本 a b c
lua -e "sin = math.sin" script a b 
-- 解释器将所有参数组织排列为:
arg[-3] = "lua"
arg[-2] = "-e"
arg[-1] = "sin = math.sin"
arg[0] = "script"
arg[1] = "a"
arg[2] = "b"
  1. 通常脚本只会使用正数索引(示例中的 arg[1] 和 arg[2])
  2. 在 lua 5.1 中,一个脚本还可以通过 “变长参数语法” 来检索其参数
  3. 在脚本主体中,表达式 "..." 3个点表示所有传递给脚本的参数

心得体会

  1. local 局部变量使用
  2. return 用于返回
  3. if, elseif, then, end, 用于条件判断程序结构
  4. for, while, then, end 用于循环程序结果
  5. and, not, or 用于逻辑判断
  6. function 用于定义函数
  7. true false 用于条件值的判断
  8. nil 用于将全局变量、table中的元素销毁,也是变量在未赋值之前的默认值

没有熟练掌握的保留字

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

推荐阅读更多精彩内容