您的位置:首页 > 编程语言 > Lua

Lua笔记4-变量,赋值,函数特点

2015-07-27 15:06 351 查看
--[[
String:
运行时,Lua会自动在string和numbers之间自动进行类型转换,当一个字符串使用算术操作符时,string就会被转成数字。

print("10" + 1)             --> 11

print("10 + 1")             --> 10 + 1

print("-5.3e - 10" * "2")   --> -1.06e-09

print("hello" + 1)          -- ERROR (cannot convert "hello")

反过来,当Lua期望一个string而碰到数字时,会将数字转成string。
print(10 .. 20)      --> 1020

..在Lua中是字符串连接符,当在一个数字后面写..时,必须加上空格以防止被解释错。

尽管字符串和数字可以自动转换,但两者是不同的,像10 == "10"这样的比较永远都是错的。
如果需要显式将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil。

line = io.read()         -- read a line

n = tonumber(line)       -- try to convert it to a number

if n == nil then

    error(line .. " is not a valid number")

else

    print(n*2)

end
反之,可以调用tostring()将数字转成字符串,这种转换一直有效:
print(tostring(10) == "10")     --> true
print(10 .. "" == "10")         --> true

--]]
--[[
赋值:
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

a. 变量个数 > 值的个数             按变量个数补足nil

b. 变量个数 < 值的个数             多余的值会被忽略

例如:

a, b, c = 0, 1

print(a,b,c)             --> 0   1   nil

a, b = a+1, b+1, b+2     -- value of b+2 is ignored

print(a,b)               --> 1   2

a, b, c = 0

print(a,b,c)             --> 0   nil   nil

上面最后一个例子是一个常见的错误情况,注意:如果要对多个变量赋值必须依次对每个变量赋值。

a, b, c = 0, 0, 0

print(a,b,c)             --> 0   0   0
多值赋值经常用来交换变量,或将函数调用返回给变量:a, b = f(),f()返回两个值,第一个赋给a,第二个赋给b。

--]]
 <pre name="code" class="cpp">--[[
Table:
如果真的想要数组下标从0开始:

days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday",

"Thursday", "Friday", "Saturday"}

注意:不推荐数组下标从0开始,否则很多标准库不能使用。

在构造函数的最后的","是可选的,可以方便以后的扩展。

a = {[1]="red", [2]="green", [3]="blue",}

在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。

{x=10, y=45; "one", "two", "three"}

--]]

--[[
应该尽可能的使用局部变量,有两个好处:

1. 避免命名冲突

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

我们给block划定一个明确的界限:do..end内的部分。当你想更好的控制局部变量的作用范围的时候这是很有用的。

do

local a2 = 2*a

local d = sqrt(b^2 - 4*a*c)

x1 = (-b + d)/a2

x2 = (-b - d)/a2

end            -- scope of 'a2' and 'd' ends here

print(x1, x2)

]]

--[[
For循环:
范型for循环:

前面已经见过一个例子:

-- print all values of array 'a'

for i,v in ipairs(a) do print(v) end

范型for遍历迭代子函数返回的每一个值。

再看一个遍历表key的例子:

-- print all keys of table 't'

for k in pairs(t) do print(k) end

范型for和数值for有两点相同:

1. 控制变量是局部变量

2. 不要修改控制变量的值

再看一个例子,假定有一个表:

days = {"Sunday", "Monday", "Tuesday", "Wednesday",

"Thursday", "Friday", "Saturday"}

现在想把对应的名字转换成星期几,一个有效地解决问题的方式是构造一个反向表:

revDays = {["Sunday"] = 1, ["Monday"] = 2,

["Tuesday"] = 3, ["Wednesday"] = 4,

["Thursday"] = 5, ["Friday"] = 6,

["Saturday"] = 7}

下面就可以很容易获取问题的答案了:

x = "Tuesday"

print(revDays[x])        --> 3

我们不需要手工,可以自动构造反向表

revDays = {}

for i,v in ipairs(days) do

revDays[v] = i

end

--]]

--[[
print("===========function =============")

local function ftest(table_m ) --当只有一个参数的时候,函数调用可以不用()
for k,v in pairs(table1) do
print(k,v)
--    print("\n"..number1)
end
end

ftest {a=123,b='helloworld'} --可以不带 ()

--]]







                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: