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
A:false
和nil
被判定为假,其他的值都被判定为真。这里特别要注意,不同于C语言,0
也被判定为真。
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码来指定字符
A:
1、使用""
或''
,
a = "string"
b = 'another string'
2、使用[[...]]
,
--[[ 这种方式的优势在于可以将字符串写在多行而无需"\"换行符,
而缺点在于不能内嵌"]]"。同时这其中的转义字符不被解释。]]
page = [[
a
b
c
]]
3、使用..
,可以将两个值连接为一个整体的字符串,
--[[ 注意,使用时".."左边的数字与".."之间必须有空个空格。
否则".."中的第一个"."会被认为是小数点。
规范的写法,".."与两边的数字都用空格分开吧。]]
print(10 .. 20)
print("Hello" .. "World")
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
A:它有些类似于数组,但它比数组的功能更强大。table中可以存储任何数据,同时可以用数字或者字符串作为key。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
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"}
相同。
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
]]
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