【Lua学习】Lua代码约定、规范、数据类型

脚本式编程

我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,如我们将如下代码存储在名为 hello.lua 的脚本文件中:

print("Hello World!")

使用编译器运行这个lua文件,就可以输出结果为:

Hello World!

除了脚本式编程之外,还交互式编程,这里我觉得脚本式还是来的实在,也更加符合之前的编程习惯,所以后面的学习都将用此方法。

词法约定

变量是以字母(letter)或者下划线开头的字母、下划线、数字序列。请不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。

注意:Lua是大小写敏感的。 如and是保留字,但是And和AND则不是Lua的保留字。在SciTE中输入保留字的时候,会自动变为蓝色粗黑体。

代码规范

Lua的多条语句之间并不要求任何分隔符,如C语言的分号(;),其中换行符也同样不能起到语句分隔的作用。因此下面的写法均是合法的。如:

a = 1

b = a * 2

a = 1;

b = a * 2;

a = 1; b = a * 2;

a = 1  b = a * 2

 

注释

单行注释

两个减号是单行注释:

--

多行注释

--[[

 多行注释

 多行注释

 --]]

 

也有看到有经验的大神补充多行注释的方法:

多行注释推荐使用 --[=[注释内容]=],这样可以避免遇到table[table[idx]]时就将多行注释结束了。

标示符

Lua 标示符用于定义一个变量,函数获取其他用户定义的项。标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。

最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的。

Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符。 Lua 是一个区分大小写的编程语言。因此在 Lua 中 Runoob 与 runoob 是两个不同的标示符。

 

关键词

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

and

break

do

else

elseif

end

false

for

function

if

in

local

nil

not

or

repeat

return

then

true

until

while

     

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

 

变量

Lua变量分为全局变量局部变量

全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,全局变量在整个文件中起作用。访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil.

print(b)                                --> nil

b = 10

print(b)                                -->10

 

--如果你想删除一个全局变量,只需要将变量赋值为nil

 

b = nil

print(b)                                --> nil

这样变量b就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。

局部变量通过local 来声明。与全局变量不同,局部变量只在被声明的那个代码块内有效。代码块:指一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串)。运行以下代码结果如下:

local m = 9

 

if m <= 10 then

    local m = 5               -- 这个局部变量m的作用范围是 then 和end 之间

    print(m)                                                      -->5

end

 

if m <= 10 then

                 local a=123

                 print(a)                                                             -->123 局部变量

    print(m)                     -->9 这个m是一开始声明的局部变量m

end

 

print(a)                                                                              -->nil 因为a只存在于上面一个if end 代码块中

另外Lua是动态类型语言,声明变量的时候不要类型定义。变量的类型和当前所赋值的类型是一致的。

数据类型

Lua中的值有8种类型:nil、boolean、number、string、userdata、function、thread和table

 

nil型

Lua中特殊的类型,他只有一个值:nil,它的主要功能是由于区别其他任何值。一个全局变量没有被赋值以前默认值为nil;给全局变量负nil可以删除该变量。Lua将nil用于表示一种“无效值”的情况。

 

boolean型

该类型有两个可选值:false和true。但要注意Lua中所有的值都可以作为条件。在Lua中只有当值是false和nil时才视为“假”,其它值均视为真,如数字零和空字符串,这一点和C语言是不同的。

 

number型

表示实数。双精度类型的实浮点数。

string型

指字符的序列。lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。这意味着你可以存储任意的二进制数据在一个字符串里。

 

m = "abc"

n = "\97\98\99"                 -- “a”的数值是97(decimal),”b”是98,”c”是99

print(m,n)                      --> abc  abc

print(“\09798”)                  --> a98

string和其他对象一样,Lua自动进行内存分配和释放,一个string可以只包含一个字母也可以包含一本 书,Lua可以高效的处理长字符串,1M的string在Lua中是很常见的。可以使用单引号或者双引号把一串字符括起来表示字符串:

 

a = "hello"

b = 'world'

为了风格统一,最好使用一种。例如一直使用双引号来表示字符串。如果双引号之间有单引号,系统会自动识别此单引号;如果双引号中之间还有双引号,则里面的双引号需要用转义字符\来区别: \

 

print("one line\nnext line\n\"in quotes\", 'in quotes'")

--[[

运行结果是:

one line

next line

"in quotes", 'in quotes'

]]

 

另外记住: Lua中的字符串是恒定不变的。String.sub函数以及Lua中其他的字符串操作函数都不会改变字符串的值,而是返回一个新的字符串。一个常见的错误是:string.sub(s, 2, -2)

 

认为上面的这个函数会改变字符串s的值。其实不会。如果你想修改一个字符串变量的值,你必须将变量赋给一个新的字符串:s = string.sub(s, 2, -2)

 

table型

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:数组、矩阵、链表、队列等,Lua都是通过table来很好地实现。

 

Lua中table的键(key)可以为任意类型(nil除外)。当通过整数下标访问table中元素时,即是数组。此外,table没有固定的大小,可以动态的添加任意数量的元素到一个table中

 

local t = {32,"jeep", name = "cherry"}

local p = {["name"] = "peach"}

print(t[1])                         --> 32

print(t[2])                         --> jeep

print(t["name"],t.name)              --> cherry  cherry

print(p["name"],p.name)         --> peach  peach

function型

函数是第一类值,意味着函数可以存储在变量中,可以作为函数的参数,也可以作为函数的返回值。这个特性给了语言很大的灵活性

 

userdata型

userdata可以将C数据存放在Lua变量中,userdata在Lua中除了赋值和相等比较外没有预定义的操userdata用来描述应用程序或者使用C实现的库创建的新类型。

 

我们也可以通过type函数获得变量的或值的类型信息,该类型信息将以字符串的形式返回。

 

local k = 1                         -- k是局部变量

print(type(k))                      --> number

 

k = "today is Friday"               -- 将一个字符串赋值给k

print(type(k))                      --> string

 

k = {1,2}                           -- 将一个表赋值给k

print(type(k))                      --> table

 

local d                             -- d 是局部变量,声明的时候未赋值

print(type(d))                      --> nil

d = 11                              -- d 后来被赋值

print(type(d))                      --> number

 

h = 9                               -- h是全局变量

print(type(h))                      --> number

 

By Urien 2019年6月22日 00:25:41

发布了101 篇原创文章 · 获赞 115 · 访问量 16万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览