Programming in Lua(Thrid Edition)笔记---2 Types and Values

2 Types and Values

  • 基础类型:nil,boolean,number,string,userdata,function,thread,table

  • type()可以获取变量的动态类型,返回一个字符串

  • 除了nilfalse,其他均为true,包括0和空字符串

  • Lua没有整型,所有数均为双精度浮点数,所以12.7-20+7.3结果不完全等于0

  • 科学计数法,十进制:4.57e-3,十六进制:0xa.bp2(a.b=10.6875, 0xa.bp2=10.6875*2^2)

  • Lua的字符串可以只含一个字符,也可以包含正本书

  • 没有办法改变字符串变量中的某一个字符,但可以赋一个新的字符串

  • stirng.gsub(a, "one", "another")把字符串a中的one改为another

  • 操作符#可以用来获取字符串的长度

    1
    2
    a = "hello"
    print(#a) --> 5
  • 字符串可以用双引号也可以用单引号括起来,仅有一点区别:可以在引号里直接使用另一种引号而无需转义

  • 转义字符:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    \a bell
    \b back space
    \f form feed
    \n newline
    \r carriage return
    \t horizontal tab
    \v vertical tab
    \\ backslash
    \" double quote
    \' single quote
  • 字符也可以用\ddd\xhh表示,\ddd为10进制表示法,前导零用于消除后面紧跟的数字带来的歧义,\xhh为十六进制表示法,例如alo\n123\"\97lo\10\04923\x61\x6c\x6f\x0a\x31\x32\x33\x22均表示同一字符串

  • 长字符串的表示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    page = [[
    <html>
    <head>
    <title>An HTML Page</title>
    </head>
    <body>
    <a href="http://www.lua.org">Lua</a>
    </body>
    </html>
    ]]

为了不与字符创中的[[]]发生冲突,可以在两个方括号之间加上等量的等号,注释--[[]]--也可以此解决冲突

1
2
3
4
5
6
7
8
9
10
page = [===[
<html>
<head>
<title>An HTML Page</title>
</head>
<body>
<a href="http://www.lua.org">Lua</a>
</body>
</html>
]===]

  • Lua里特设的转义字符\z用于给字符串分行,它会跳到下一个非空字符

    1
    2
    data = "\x00\x01\x02\x03\x04\z
    \x05\x06\x07\x08\x09"
  • ..为字符串连接操作符

  • 字符串和数字可以直接相互转换

    1
    2
    3
    4
    5
    print("10" + 1)         --> 11
    print("10 + 1") --> 10 + 1
    print("-5.3e-10" * "2") --> -1.06e-09
    print("hello" + 1) --> ERROR(cannot convert "hello")
    print(10 .. 20) --> 1020

print(10 .. 20)中数字跟..之间需用空格隔开

  • 明确的转换:tonumber()tostring()

  • 将数字转为字符串也可以通过跟""连接

    1
    print(10 .. "" == "10") --> true
  • 在使用table之前需先构造它

  • table的索引可以为整数(列表型),也可以为字符串(记录型),也可以为其他类型,且均可以混用

  • 构造列表时,下标从1开始而非0

    1
    2
    3
    a = {1, 2, 3}
    print(a[1]) --> 1
    print(a[2]) --> 2
  • 没有洞(nil)的list称为sequence,对于sequence,可以用#操作符获取其长度

    1
    2
    3
    for i = 1, #a do
    print(a[i])
    end
  • a.b和a[b]不同,a.b=a[“b”]

  • Lua中变量赋为函数,函数的参数和返回值也可为函数,table的索引也可以为函数

    1
    2
    3
    4
    5
    6
    function f(n)
    print(n)
    end
    a = {}
    a[f] = f
    a[f](10) --> 10
  • 所有的变量在赋为nil之后会被回收