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

来源:互联网 发布:java获取自己程序路径 编辑:程序博客网 时间:2024/04/30 15:07

Q:Lua的基本变量类型?

A:

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

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

print(type("Hello world"))  --> stringprint(type(10.4*3))         --> numberprint(type(print))          --> functionprint(type(type))           --> functionprint(type(true))           --> booleanprint(type(nil))            --> nilprint(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 = [[abc]]

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

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

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

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

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

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

print(10 .. 20)               --> 1020print(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"])    --> 10print(coor["y"])    --> 20print(coor[1])    --> nilprint(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}    --> ERRORx = 2a = {x = "one", "two", "three"}print(a["x"])    --> oneprint(a[1])    --> twoprint(a[x])    --> threeprint(a.x)    --> oneprint(a."x")    --> ERRORa = {["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替换为anotherprint(a)       --> one stringprint(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 = nilfor line in io.lines() do  list = {next=list, value=line}end-- 打印链表。l = listwhile l do  print(l.value)  l = l.nextend

而这种实现方式在实际使用中几乎不用,链表的更好实现方式是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)  endend
0 0
原创粉丝点击