Lua(三)——语句-创新互联

lua支持的常规语句基本上与C/Java等语言中所支持语句差不多,包括了赋值、控制结构等,当然也有一些区别,如lua中的多重赋值等。

目前创新互联已为近1000家的企业提供了网站建设、域名、虚拟空间、成都网站托管、企业网站设计、潘集网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

1. 赋值语句

赋值是最基本、最简单的语句,将变量与值用=相连,=左边为变量,右边为值:

name = "Tom"
age = 20
1.1 全局变量与局部变量

直接通过上述方式赋值,则变量为全局变量,在任何位置均可被访问。与全局变量相对的是局部变量,只能在被赋值的语句块即当前作用域中被访问。在lua中,语句块可以是一个控制结构的执行体、函数的执行体或使用do end手动构造的程序块:

-- 手动构造程序块
do
    local name, sex = "Lucy", "female"
    print(name .. " & " .. sex)  -- Lucy & female
end
print(name .. " & " .. sex)  -- stdin:1: attempt to concatenate global 'sex' (a nil value)

建议在编写lua代码时尽可能地使用局部变量。使用局部变量有以下几点好处:

  1. 避免污染全局命名空间;

  2. 局部变量的访问速度比全局变量更快;

  3. 局部变量会随其作用域的结束而消失,使GC可以更快的释放其值。

关于局部变量,在lua中还有一种常见的用法:

local foo = foo

该语句创建局部变量foo,并用全局变量foo的值对其进行初始化,这样做一来可以暂存全部变量foo的值,二来可以加速在当前作用域对foo的访问。

1.2 多重赋值

python相似,在lua中允许多重赋值:

name, age = "Tom", 20

为什么说与python相似而没有说相同呢,这是因为在python中,变量的个数和值的个数必须相同,否则会抛出Error。而在lua中,如果变量个数多于值的个数,则多出的变量不会被赋值,即值为nil;如果变量个数小于值的个数,则多出的值会被直接忽略:

-- lua
name, age, sex = "Tom", 20  -- 此时name == "Tom", age == 20, sex == nil
name, age = "Tom", 20, "male"  -- 此时name == "Tom", age == 20, 值"male"被忽略

# python
name, age, sex = "Tom", 20  # ValueError
name, age = "Tom", 20, "male"  # ValueError
name, age = 20  # TypeError

多重赋值可以在不引入中间变量的情况下交换两个变量的值:

key = "name"
value = "Tom"
key, value = value, key
print("key == " .. key .. " & value== " .. value)  -- key == Tom & value == name

多重赋值的另一个比较常见的应用是收集函数的多个返回值,在讲到函数时再做具体展开。

2. 控制语句

控制语句通过逻辑判断即true或false控制程序流程。在提到逻辑判断时还要再强调一遍,lua中所有非false和nil的值都为true,包括数字0和空字符串。

2.1 if/elseif/else

if/elseif/else用于控制单次流程的进行:

name = "Tom"
if name == "Lucy" then
    print("Hello, Lucy.")
elseif name == "Jordan" then
    print("Hi, Jordan.")
else
    print("Yoho, Buddy.")
end

elseif的出现使流程更简便,可以省去else if的一个多余的end。

2.2 while & repeat until

while和repeat until都用来循环,repeat until与C/C++/Java中的do while相同,先执行后判断,循环至少会执行一次;while则先判断后执行,循环可能一次都不执行:

-- while
cond = true
while cond do
    line = io.read()
    if line ~= "" then
        print(line)
        cond = false
    end
end

-- repeat until
repeat
    line = io.read()
until line ~= ""
print(line)
2.3 for

for同样用来做循环,用for做循环有两种形式,一种针对数字,一种针对泛型:

-- 针对数字
-- 从1循环到10,步长为1(不指定步长时默认为1)
for i = 1, 10, 1 do
    print(i * 2)

-- 针对泛型
-- 两个内置函数,pairs()针对数组形式的table,ipairs()针对对象形式的table
-- 数组形式的table
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
for k, v in ipairs(days) do
    print("index == " .. k .. " & value == " .. v)
end
-- 对象形式的table
people = {name="Tom", sex="male", job="engineer", address="Beijing"}
for k, v in pairs(people) do
    print("key == " .. k .. " & value == " .. v)
end

下面我们给出for循环在python中的实现形式,方便对照理解:

# 针对数字
# 从1循环到10,步长为1(不指定步长时默认为1)
for i in xrange(1, 10, 1):  # 可以用range()代替xrange()
    print i

# 针对泛型
# list
days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
# 方式一
for i in days:
    print "index == %s & value == %s" % (days.index(i), i)
# 方式二
for i in xrange(len(days)):
    print "index == %s & value == %s" % (i, days[i])
# dict
people = {"name": "Tom", "sex": "male", "job": "engineer", "address": "Beijing"}
for k, v in people.iteritems():  # 
    print "key == %s & value == %s" % (k, v)  # 可以用people.items()代替people.iteritems()

3. 退出语句

3.1 break

break用于退出循环:

for i = 1, 10 do
    if i % 3 == 0 then
        print(i)
        break
    end
end

要注意的一点是,lua中没有大多数编程语言中都有的continue关键字,即不可使用continue直接退出单次循环。

3.2 return

return用于退出函数:

function plus(num1, num2)
    return num1 + num2
end

如果函数中没有显式return,则函数会返回nil,和JavaScript中返回undefined,python中返回None相同。

在调试程序时,如果想让一个函数什么都不做,可以使其直接return,但return必须是语句块中的最后一条语句,如下做法会报语法错误:

function foo()
    return
    -- some actions
    -- do something

若想达到所要的效果,可以将return用一个do end构造的语句块包起来:

function foo()
    do return end
    -- some actions
    -- do something

完。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前题目:Lua(三)——语句-创新互联
浏览路径:http://ybzwz.com/article/ddccec.html