2019年12月

1、行注释

--

2、块注释

--[[

  内容

]]

3、重新启用块注释

---[[ (相当于一个行注释)

   内容

--]] (相当于一个行注释)

所以,中间的内容可以显示。

1、可以将任何二进制数据存储到一个字符串中

2、string类型是不可变的值,根据修改要求来创建一个新的字符串

a = 'one string'
b = string.gsub(a,'one','another')  -- 修改字符串的一部分
print(b)  -- another string 

3、转义序列

\a 响铃、\b 退格、\f提供表格、\n换行、\r回车、\t水平tab、\v垂直tab、\\反斜杠、\"双引号、\'单引号

4、通过数值来指定字符串中的字符 -- \

"alo\n123\" = "\97lo\10\04923"
在 ASCII 中, 'a' 的编码是 97, '\n' 的编码是 10, '1' 的编码是 49
注意:
049 的‘0’不可以省略,否则会认为是492。而 97 后面的是‘l’,所以可以省略前面的‘0’。
总而言之,能不能省略‘0’,要看省略‘0’后会不会引起歧义。

5、

a = [[
    ...
    ]]

io.write(a)
[[ ]] 界定字母字符串
lua不会解释其中的转义序列
写含有程序代码的字符串尤为有效

6、在一个字符串上应用 算数运算符 时,lua 会尝试将这个字符串转换成一个数字

print("10"+1)  -- 11
print("10+1")  -- 10+1
print("-5.3e-10"*"2")  -- -1.06e-09
print("hello"+1)  -- 错误

7、期望得到字符串但却得到一个数字时,他也会将数字转化为字符串

print(10 .. 20)  -- 1020
注意:
.. 和数字之间要有空格,否则会被误认为小数点

8、字符串 ——> 数字

tonumber() 

9、数字 ——> 字符串

tostring() 
.. (连接符) 

10、在字符串前加 ‘#’,可以获得字符串的长度

a = 'Hello'  
print(#a)  -- 5

11、 string.find(s1,s2)

查找字符串 s2 在 s1 中第一次出现的位置
local s = 'shui_a_zai'
local index = string.find(s,'_')
print(index)

结果为 5

12、string.sub()

string.sub(s,i,j)
返回字符串s从第i个字符到第j个字符的子串,参数i和参数j均可以为负数
b = 'shuiqingyuan_'
ret = string.sub(b,1,-2)
print(ret) -- shuiqingyuan
string.sub(s,i)
如果省略参数j,默认为-1,也就是子串截止到原串的最后
string.sub(s, -i)
返回子串长度为i的原串的后缀。

1、不能以数字开头

2、避免'_' + 大写字母,保留用作特殊用途

3、'_' 哑变量

4、保留字

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

5、有大小写之分

1、io.read()、io.write()、io.input()、io.output()、print()

io.read()

stdin(标准输入),一般指键盘输入到缓冲区里的东西

io.read("*all") --- 读取整个文件作为一个字符串
io.read("*line") --- 读取下一行
io.read("*number") --- 从字符串中转换出一个数值
io.read(num) --- 读取num个字符串
io.read() --- 默认读取一行

io.write()

stdout(标准输出)

io.write(a,b,c) == io.write(a .. b .. c) ,但是 io.write(a .. b .. c) 消耗更多资源。
二者均是原样输出参数
a,b,c 均不能为nil,io.write({})也会报错,参数应该是string,而不能是table

print()

print(a,b), 输出的a,b 之间会有 \t 制表符
末尾自动换行
自动调用参数的tostring()方法

ioread("xx")

输入为某个xx文件

iowrite("yy")

输出到yy文件

2、loadfile、loadstring、dofile、require

loadfile

编译代码或中间码并且返回编译后的 chunk 作为一个函数,而不运行

loadstring

同loadfile,不过他不是从文件中读,而是从一个串中读

dofile

编译+运行。
每次都要编译

require

只加载一次
与dofile不同的是:
  • require 会搜索目录加载文件
  • require 会判断文件是否已经加载避免重复加载同一个文件

假设 package.path 的值是:

/Users/dengjoe/lua/?.lua;./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua

那么调用 require("module") 时就会尝试打开以下文件目录去搜索目标:

/Users/dengjoe/lua/module.lua;
./module.lua
/usr/local/share/lua/5.1/module.lua
/usr/local/share/lua/5.1/module/init.lua
/usr/local/lib/lua/5.1/module.lua
/usr/local/lib/lua/5.1/module/init.lua

3、pcall()

在lua中需要处理错误,则使用篇call函数封装代码