快速掌握Lua 5.3 —— 各种变量和值

Q:Lua的基本变量类型?

A:

nil, boolean, number, string, userdata, function, thread, and table.

type()可以获取一个变量的类型,

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

Q:Lua中何为真,何为假?

A:falsenil被判定为假,其他的值都被判定为真。这里特别要注意,不同于C语言,0也被判定为真。

Q:Lua中的转义序列?

A:与C中的相同。

\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 使用ASCII码来指定字符

Q:Lua中如何创建字符串?

A:
1、使用""''

a = "string"
b = 'another string'

2、使用[[...]]

--[[ 这种方式的优势在于可以将字符串写在多行而无需"\"换行符,
     而缺点在于不能内嵌"]]"。同时这其中的转义字符不被解释。]]
page = [[
a
b
c
]]

3、使用..,可以将两个值连接为一个整体的字符串,

--[[ 注意,使用时".."左边的数字与".."之间必须有空个空格。
     否则".."中的第一个"."会被认为是小数点。
     规范的写法,".."与两边的数字都用空格分开吧。]]
print(10 .. 20)
print("Hello" .. "World")

Q:Lua中数字与字符串之间的转换方法?

A:lua支持在运行过程中动态将字符串转换为数字,前提是涉及到了算数运算的操作。

print("10" + 1)           --> 11
print("hello" + 1)        --> ERROR (cannot convert "hello")

lua也支持在运行过程中动态将数字转换为字符串,前提是lua发现此处需要字符串而却给出了数字。

print(10 .. 20)               --> 1020
print(10 .. "" == "10")       --> true

更规范的转换方式为使用tonumber()以及tostring(),

> print(type(tonumber(“10”)))
number
> print(type(tostring(10)))
string

Q:Lua中的table是什么?

A:它有些类似于数组,但它比数组的功能更强大。table中可以存储任何数据,同时可以用数字或者字符串作为key。table的存储空间是动态的,可以任意向其中添加成员。

Q:如何创建以及使用table?

A:

-- 创建一个空的table,并用变量a存储。
a = {}
-- table中未初始化的成员初始值为"nil"。
print(a[1])    --> nil

-- 创建table的时候给出初始数据。
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "Saturday"}
-- 通过索引使用table。
--[[ 注意!table的索引从1开始。虽然你也可以使用索引0存储数据以及使用索引0的数据,
     但是Lua使用的库函数都遵循从1开始的规则,所以你最好也是遵守吧。]]
print(days[1])   --> "Sunday"

-- 创建table时给出索引名以及其对应的初始值。
coor = {x = 10, ["y"] = 20, [21] = 300}
-- 通过字符串索引使用table。
--[[ 注意!此时coor[1]并没有被初始化。
     可以不必从索引1开始赋值,同时coor["x"]不是coor[1]。]]
print(coor["x"])    --> 10
print(coor["y"])    --> 20
print(coor[1])    --> nil
print(coor[21])    --> 300

-- 创建嵌套table。
polyline = {color="blue", thickness=2, npoints=4,
             {x=0,   y=0},
             {x=-10, y=0},
             {x=-10, y=1},
             {x=0,   y=1}
           }    -- polyline[1]到polyline[4]分别代表4个嵌套table。
print(polyline[2].x)    --> -10

Q:a{x},a{“x”},a{[x]},a{[“x”]},a.x,a.”x”,a[x],a[“x”],a.x,a.”x”?

A:

a = {"x" = one}    --> ERROR
x = 2
a = {x = "one", "two", "three"}
print(a["x"])    --> one
print(a[1])    --> two
print(a[x])    --> three
print(a.x)    --> one
print(a."x")    --> ERROR
a = {["x"] = "one", "two", [x] = "three"}
-- 与上面的打印结果相同。

总结:
没有a{"x"}这种用法;
没有a."x"这种用法;
a["x"]a.x相同;
a{x}a{["x"]}相同;
{"red", "green", "blue"}{[1]="red", [2]="green", [3]="blue"}相同。

Q:如何遍历”table”中每个连续数字索引的元素?

A:

a = {1, 2, x = 7, 3, [9] = 100}

--[[ ipairs()返回两个值,table的key和value。
     ipairs()不连续的数字索引,比如"[9]",
     或是非数字索引的元素,比如"x"。]]
for i,val in ipairs(a) do
  print("[" .. i .. "] = ", val)
end
--[[ the result.
[1] =   1
[2] =   2
[3] =   3
]]

-- table.unpack返回table的value。
--[[ table.unpack()只能返回table的value。
     table.unpack()不连续的数字索引,比如"[9]",
     或是非数字索引的元素,比如"x"。]]
print(table.unpack(a))
--[[ the result.
1    2    3
]]

Q:如何遍历”table”中所有的元素?

A:

a = {1, 2, x = 7, 3}

-- pairs()返回两个值,table的key和value。
for i,val in pairs(a) do    -- pairs()返回table中所有的key和value。
  print("[" .. i .. "] = ", val)
end
--[[ the result.
[1] =   1
[2] =   2
[3] =   3
[x] =   7
[9] =   100
]]

附加:

1、lua变量中存储的字符串中的任意字符是不能在程序运行过程中改变的。

a = "one string"
b = string.gsub(a, "one", "another")  -- 将字符串中的one替换为another
print(a)       --> one string
print(b)       --> another string

2、尽管数字与字符串可以自动转换,但数字和字符串并不是等同的,

print(10 == "10")    --> false

3、Lua的package也是使用table来表示。比如io.read()实际上是调用io表中key为read的函数。
4、当没有变量保存table的引用时,lua会自动释放table所占的内存空间。
5、用table来实现链表,

-- 用table创建链表。
list = nil
for line in io.lines() do
  list = {next=list, value=line}
end
-- 打印链表。
l = list
while l do
  print(l.value)
  l = l.next
end

而这种实现方式在实际使用中几乎不用,链表的更好实现方式是arrays,之后会提。
6、如果你想让”table”从0开始(还是不建议,建议从1开始),很简单:

days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "Saturday"}

7、table初始化数据中最后一个元素后面的逗号是允许的:

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

8、table初始化数据之间的逗号可以使用分号代替。不过分号通常用来区分不同类型的区域,比如”list part”和”record part”:

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

9、用递归实现table.unpack(),

function unpack(t, i)
  i = i or 1
  if t[i] ~= nil then
    return t[i], unpack(t, i + 1)
  end
end

你可能感兴趣的:(lua,快速掌握Lua,5.3)