Lua学习

Chunk是一系列语句,Lua执行的每一块语句,比如一个文件或者交互模式下的没一行都是一个Chunk。每个语句结尾的分号是可选的。
一个Chunk可以是一个语句,也可以时一系列语句的组合,还可以时函数,在Lua中几个MByte的Chunk是很常见的。
在交互模式下,Lua 通常把每一个行当作一个 Chunk,但如果 Lua 一行不是一个完整的 Chunk 时,他会等待继续输入直到得到一个完整的Chunk.在 Lua 等待续行时,显示不同的提示符(一般是>>).
可以通过指定参数让Lua执行一系列Chunk:
-l选项:
例如:假定一个文件 a 内有单个语句x=1;另一个文件 b 有语句print(x)
lua -la -lb #命令会先运行a再运行b。(注意:-l 选项会调用 require,将会在指定的目录下搜索文件)  
    -i 选项:要求Lua运行指定Chunk后进入交互模式
lua -i -la -lb 运行后进入交互模式
另一个连接外部Chunk的方法是使用dofile函数,difile函数加载文件并执行它。
例:

-- file 'lib1.lua'
function norm (x, y)
local n2 = x^2 + y^2
return math.sqrt(n2)
end
function twice (x)
return 2*x
end
在交互模式下:
> dofile("lib1.lua")                -- load your library
> n = norm(3.4, 1.0)
> print(twice(n))                   --> 7.0880180586677
-i 和 dofile 在调试或者测试 Lua 代码时是很方便的。`

全局变量

全局变量不需要进行声明,给一个变量进行赋值后即建立了这个全局变量,访问一个没有初始化的全局变量也不会出错,只是结果是 :nil

> print(b)   -->nil
> b = 10
> print(b)   -->10

若是想删除一个全局变量,则只需将变量赋值为 nil

b = nil
print(b)      --> nil

即当且仅当变量不等于 nil时,这个变量存在。

词法约定

标示符:
字母(letter)或者下划线开头的字母、下划线、数字序列.最好不要使用下划线加大写字母的标示符,因为 Lua 的保留字也是这样的。Lua 中,letter 的含义是依赖于本地环境的。
保留字:

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

注意Lua时大小写敏感的。
注释:单行注释 :–
多行注释:–[[ –]]

--[[
print(b)        -- no action (comment)
--]]

命令行方式:

lua [ options ] [scripts [args]]
-e 直接将命令传入Lua

$ lua -e "print(math.sin(12))"    --> -0.53657291800043
-l加载一个文件
-i进入交互模式
-PROMPT内置变量作为交互模式的提示符
$ lua -i -e "_PROMPT=' lua> '"
lua>

Lua 的运行过程,在运行参数之前,Lua 会查找环境变量 LUA_INIT 的值,如果变量存在并且值为@filename,Lua 将加载指定文件。如果变量存在但不是以@开头,Lua假定 filename 为 Lua 代码文件并且运行他。利用这个特性,我们可以通过配置,灵活的设置交互模式的环境。可以加载包,修改提示符和路径,定义自己的函数,修改或者重名名函数等。
全局变量 arg 存放 Lua 的命令行参数

$ lua script a b c

在运行以前,Lua 使用所有参数构造 arg 表。脚本名索引为 0,脚本的参数从 1 开始增加。脚本前面的参数从-1 开始减少。

$ lua -e "sin = math.sin" script a b

arg表如下

arg[-3] = "lua"
arg[-2] = "-e"
arg[-1] = "sin=math.sin"
arg[0] = "script"
arg[1] = "a"
arg[2] = "b"

类型和值

Lua是动态类型语言,变量不要类型定义。Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread、table。函数type可以测定给定的变量或者值的类型。

$ print(type("Hello world!"))  -->string
$ print(type(10.4 * 3))        -->number
$ print(type(type))            -->function
$ print(type(type))            -->function
$ print(type(true))            -->boolean
$ print(type(nil))             -->nil
$ print(type(type(X)))         -->string

变量没有预定义的类型,每一个变量都可能包含任意一种类型的值。

1. nil

全局变量未赋任何值时其值为nil,或将nil赋值给全局变量可以删除此变量。

2. blloean

包括true和false,注意在控制结构的条件中除了false和nil为假其它的都为真。所以Lua认为0和空串都为真。

3. string

Lua中的字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串。

a = "one strng"
b = string.gsub(a, "one", "another") -->change string
print(a)             -->one string
print(b)             -->another string

string和其它的对象一样,Lua自动进行内存分配和释放,可以使用单引号或双引号表示字符串。
转义字符:

\a bell
\b back space -- 后退
\f form feed -- 换页
\n newline -- 换行
\r carriage return -- 回车
\t horizontal tab
\v vertical tab -- 制表
\\ backslash -- "\"
\" double quote -- 双引号
\' single quote -- 单引号
\[ left square bracket -- 左中括号
\] right square bracket -- 右中括号

还可以在字符串中使用\ddd(ddd为三位十进制整数)方式表示字母。
“alo\n123\”“和’\97lo\10\04923”’是相同的。
可以使用[[…]]表示字符串,这种格式的字符串可以包含多行,也可以嵌套且不会解释转义序列,若第一个字符是换行符会被自动忽略掉。
例:

page = [[
<HTML>
<HEAD>
<TITLE>An HTML Page</TITLE>
</HEAD>
<BODY>
Lua
[[a text between double brackets]]
</BODY>
</HTML>
]]
io.write(page)

在运行时,Lua会自动在string和numbers之间自动进行类型转换,当一个字符串用算术操作符时,string就会被转化为数字。

> print("10" + 1)   -->11
> print("10 + 1")   -->10 + 1
> print("-5.3e-10" * "2")   -->-1.06e-9
> print("Hello" + 1)   -->ERROR (cannot convert "hello")

反过来,当Lua期望一个string而碰到数字时,会将数字转为string。

> print(10 .. 20)   -->1020
.. 在Lua中是字符串连接符,当在数字后面写..时,必须加上空格以防止被解释错误。

函数tostring和函数tonumber分别可以将数字到字符的转化和字符串到数字的转化。

> line = io.read()
> n = tonumber(line)
> if n ==nil then
>     error(line .. "is not a valid number")
> else
>     print(n*2)
> end


> print(tostring(10) == '10')   -->true
> print(10 .."" == '10')   -->true

4.关系运算符

< 、> 、<= 、>= 、~=、 == 这些操作返回true或false
Lua通过引用比较tables、userdata、functions,即当且仅当两者表示同一对象时相等。

5.逻辑运算符

and or not
逻辑运算符认为false和nil是假,其它为真,0也是true
and和or的运算结果不是true和false,而是和它的两个操作数有关。

6.连接运算符

“..”表示连接运算符
若是操作数为数字,Lua将会自动将其转换为字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值