Lua(三)——语句

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

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. 避免污染全局命名空间;ide

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

  3. 局部变量会随其做用域的结束而消失,使GC能够更快的释放其值。lua

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

local foo = foo

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

1.2 多重赋值

python类似,在lua中容许多重赋值:code

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

完。

相关文章
相关标签/搜索