2.0.1探讨Lua的基础知)

在笔记之前,先提供16年5月31日在官网下载的LuaForWIndows的解释器安装包:点我LuaForWindows.zip,宝典上提到的你应该使用5.1的最小版本。


废话

Lua解释器是交互的,你输入命令就可以得到回复,就像是你在用Lua这门语言和解释器进行对话一般。双击执行你的Lua解释器输入print("Hello World")就会回显到你解释器的下一行。这行语句获取你输入的字符串,然后将它传递给了print(args)这个函数,该函数再将它输出到解释器窗口中。
对于Lua错误信息的理解,你可以使用一个案例来进行解读,在输入pnrint("Hello World!")之后enter执行,你会发现如下的信息
[PS:lua中--代表注释]

stdin:1: attempt to call global 'pnrint' (a nil value)--这里指出了错误发生的行数
stack traceback:
        stdin:1: in main chunk
        [C]: ?

如上所示Lua提示你试图调用一个全局的pnrint(args),但是她是一个空值,剩余的信息叫做栈追踪[stack traback],他指出了错误出现在哪里,当你从一个函数调用另一个函数的他们很有用。另外使用上下键可以快速翻阅你的输入历史记录。


Lua处理数字


输入print(2+2)你会看见系统响应一个4,因为解释器帮你做了运算操作,Lua的运算操作符支持如下:

  • +:加,如上个例子所示
  • -:减,同上,变更符号即可
  • *:乘,同上
  • /:除,同上
  • ^:幂,example:print(13^2)=169
  • %:取模,example:print(13%2)=1
  • -: 取负,example:print(-(13^2))=-1

  • 也可以使用复杂的表达式,注意运算的优先级和括号的使用即可,即确保明确的数据关系。
    对于比较大的数值,比如1,000,000,000,000,000(10^15),你可以使用科学计数法来进行表示解释器能够识别:

    > print(10^15)
    1e+015
    > print(-10^15)
    -1e+015
    >
    

    Lua为了将他们显示出来,先将他们转化成了科学记数法,同时你也可以以这种方式来表达一个数字,表示取一个数10的几次幂,幂指数为第二个数字(中间的e不区分大小写):

    > print(1.234e6)
    1234000
    > print(1.234\*10\*10\*10\*10\*10\*10)
    1234000
    > print(1234e-4)
    0.1234
    > print(1234\*(10^-4))
    0.1234
    

    十六进制表示法:Lua可以自动的将十六进制的数值转换成十进制,以0x开头后面接着有效的0~F十六进制数字:

    > print(0x1)
    1
    > print(0xF)
    15
    > print(0x19)
    25
    > print(0x10a4)
    4260
    

    coding时你可以使用这种格式来表示数字,Lua会对他们进行正确的转换,Lua仅以十进制或者科学记数法来表示结果,不管这些数字是怎么输入的。

    > print(2\*0xF)
    30
    > print(0x10^2)
    256
    


    关于浮点的理解

    在Lua中每一个数都是使用浮点来进行表示的,在一般的使用中没有什么不妥的地方,但有时候....

    > pointTwo = 1.2 - 1.0
    > print(pointTwo<0.2)
    true
    > print(pointTwo)
    0.2
    

    显然,在这里0.2不能够被精确的表示为一个浮点数,因此编程语言必须在计算他的值和显示他的时候进入舍入。浮点数可以精确的表示所有的10-37~1037之间的整数,所以你不会尝尝用到这个问题。然而,舍入在您使用实数的时候可能会导致计算误差。



    值和变量的理解

    Lua和其他编程语言一样对于值和和变量之间进行了区分。了解值的种类和变量之间的区别对我们接下来的工作很有帮助。
    什么是值?
    他就是你直接使用的东西,就想17这个数,或者"hello"这个字符串。14是一个不同于17的值,但是他们都是一个数值,字符串"hello"是一个值,但是他和14、17是不同类型的值。
    Lua提供了如下的几种基本数据类型
  • number 所有的数字都属于这一类 example:1、7313、1e5、0xFF1a
  • string 一个字符序列 example:"Hello"
  • boolean 真(true)和假(false)属于这种类型
  • function 函数是一个可以调用的语句集合
  • table 表示传统的哈希(Hash)表(字典)和数组的混合类型
  • thread 线程类型的值是一个可用于异步计算的协同程序(有限的轻量线程)
  • userdata 用户数据是主语言(host language,通常是C)中所定义的传统的数据结构包装器
    这几种数据类型都会在以后的工作中出现,需要进行仔细的理解。



    使用type(args)函数

    type(args)在Lua中用于确定一个给定值的类型,它会给你在编程中进行确认和验证带来更大的灵活性:

    > print(type(t))
    nil
    > print(type(5))
    number
    > print(type(""))
    string
    > print(type(table))
    table
    

    如上所示,你对于传入的值进行了type(args)函数的调用,并且对他的结果进行了print(args)调用,所以它输出了你传入的值是何种类型,指的注意的是,第一个输出中,Lua解释器给出了nil因为解释器他找不到这个类型,所以他总是nil的。



    使用变量

    变量可以看做是一个Lua值的临时名称,而同一个可以有多个名称。比如如下的例子:

    > x=2
    > y=2
    > print(x+y)
    4
    

    这个例子中,你将x、y两个变量分别绑定了一个值2,然后调用print(args)进行输出。
    变量名的命名规范:必须以下划线或者字母开头。名称本身不能包含有除字母、数字或者下划线之外的其他字符。同时也不能是关键字,并且是区分大小写的。
    变量的赋值:

    > foo=14
    > print(foo)
    14
    > foo="hello"
    > print(foo)
    hello
    > x=12--将数值4绑定到x
    > y=x+2--将标识符x的值赋予标识符y并+2。这在字面上表示y=12+2
    > print(x+y)
    26
    > x=15--如果你将x从新赋值,那么也只是意味着你将x重新绑定了值,与y无关
    > print(x+y)
    29
    --值和变量之前的区别尝尝会被混淆,尤其是你在更高级的论题上工作的时候,你可以使用Lua解释器作
    --为一个工具来探索这些规则
    

    对多个变量赋值的形式:

    > x,y=12,13--如果运算符左边的变量个数比右边多,那么剩下的变量会被赋予nil值
    > print(x+y)
    25
    



    Lua中关于值的比较

    Lua中的比较运算符由如下几种可供操作:
  • 相等 ==
  • 小于 <
  • 大于 >
  • 小于等于 <=
  • 大于等于 >=
  • 不等于 ~=

  • “<”,“>”,“<=”,“>=”运算符只能用来比较相同类型的值,例如在数和数之间或者字符串和字符串之间进行比较,否则你会收到下面的错误信息:

    > print(1>="hello")
    stdin:1: attempt to compare string with number
    stack traceback:
            stdin:1: in main chunk
            [C]: ?
    

    换个说法就是:“==”和“~=”适用于所有的值,而大于和小于(“<”和“>”)这一组运算符只在数值和字符串内部有意义。

    > print("hello"=="hello1")--进行字符串比较的时候比较的是他们的内容是否相同
    false
    > print("hello"=="hello")
    true
    



    Using 字符串

    “>”、“<” 运算符可以在字符串上使用,但是结果将取决于系统内部对不同字符的排列次序,对于单个字符的比较,运算符比较两个字符在字符集中的次序; 对于多个字符比较,他将比较两个字符串中第一个出现的不同字符。

    > print("hello"=="hello1")--1
    false
    > print("hello"=="hello")--2
    true
    > print("a"<"b")--3
    true
    > print("b">="a")--4
    true
    > print("abcd"<"abce")--5
    true
    > print("a"<"A")--6
    false
    > print("abcd"<"abcde")
    true
    > print("rests"<"test")--比较第一个出现的不同字符,也就是拿着'r'和't'比较
    true
    

    第6个例子,在标准的Lua字符集中,大写英文字母在小写英文字母签名,因此,'a'要比'A'大。

    你可能感兴趣的:(2.0.1探讨Lua的基础知))