<p>在笔记之前,先提供16年5月31日在官网下载的LuaForWIndows的解释器安装包:点我<a href="http://pan.baidu.com/s/1slmrg2x" title="Title">LuaForWindows.zip</a>,宝典上提到的你应该使用5.1的最小版本。</p>
<p><h6>废话</h6>
Lua解释器是交互的,你输入命令就可以得到回复,就像是你在用Lua这门语言和解释器进行对话一般。双击执行你的Lua解释器输入print("Hello World")
就会回显到你解释器的下一行。这行语句获取你输入的字符串,然后将它传递给了print(args)
这个函数,该函数再将它输出到解释器窗口中。
对于Lua错误信息的理解,你可以使用一个案例来进行解读,在输入pnrint("Hello World!")
之后enter执行,你会发现如下的信息<h6>[PS:lua中--代表注释]</h6>
stdin:1: attempt to call global 'pnrint' (a nil value)--这里指出了错误发生的行数
stack traceback:
stdin:1: in main chunk
[C]: ?
如上所示Lua提示你试图调用一个全局的pnrint(args)
,但是她是一个空值,剩余的信息叫做栈追踪[stack traback],他指出了错误出现在哪里,当你从一个函数调用另一个函数的他们很有用。另外使用上下键可以快速翻阅你的输入历史记录。
</p>
<h6>Lua处理数字</h6>
<p>
输入print(2+2)
你会看见系统响应一个4,因为解释器帮你做了运算操作,Lua的运算操作符支持如下:
<li>+:加,如上个例子所示
<li>-:减,同上,变更符号即可
<li>*:乘,同上
<li>/:除,同上
<li>^:幂,example:print(13^2)
=169
<li>%:取模,example:print(13%2)
=1
<li>-: 取负,example:print(-(13^2))
=-1</li>
也可以使用复杂的表达式,注意运算的优先级和括号的使用即可,即确保明确的数据关系。
对于比较大的数值,比如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
</p>
<p><h6>关于浮点的理解</h6>
在Lua中每一个数都是使用浮点来进行表示的,在一般的使用中没有什么不妥的地方,但有时候....
> pointTwo = 1.2 - 1.0
> print(pointTwo<0.2)
true
> print(pointTwo)
0.2
显然,在这里0.2不能够被精确的表示为一个浮点数,因此编程语言必须在计算他的值和显示他的时候进入舍入。浮点数可以精确的表示所有的10-37~1037之间的整数,所以你不会尝尝用到这个问题。然而,舍入在您使用实数的时候可能会导致计算误差。
</p>
<p>
<h6>值和变量的理解</h6>
Lua和其他编程语言一样对于值和和变量之间进行了区分。了解值的种类和变量之间的区别对我们接下来的工作很有帮助。
什么是值?
他就是你直接使用的东西,就想17这个数,或者"hello"这个字符串。14是一个不同于17的值,但是他们都是一个数值,字符串"hello"是一个值,但是他和14、17是不同类型的值。
Lua提供了如下的几种基本数据类型
<li>number 所有的数字都属于这一类 example:1、7313、1e5、0xFF1a
<li>string 一个字符序列 example:"Hello"
<li>boolean 真(true)和假(false)属于这种类型
<li>function 函数是一个可以调用的语句集合
<li>table 表示传统的哈希(Hash)表(字典)和数组的混合类型
<li>thread 线程类型的值是一个可用于异步计算的协同程序(有限的轻量线程)
<li>userdata 用户数据是主语言(host language,通常是C)中所定义的传统的数据结构包装器
这几种数据类型都会在以后的工作中出现,需要进行仔细的理解。
</p>
</p>
<h6>使用type(args)函数</h6>
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的。</p>
<p>
<h6>使用变量</h6>
变量可以看做是一个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
</p>
<p>
<h6>Lua中关于值的比较</h6>
Lua中的比较运算符由如下几种可供操作:
<li>相等 ==
<li>小于 <
<li>大于 >
<li>小于等于 <=
<li>大于等于 >=
<li>不等于 ~=</li>
“<”,“>”,“<=”,“>=”运算符只能用来比较相同类型的值,例如在数和数之间或者字符串和字符串之间进行比较,否则你会收到下面的错误信息:
> 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
</p>
<p>
<h6>Using 字符串</h6>
“>”、“<” 运算符可以在字符串上使用,但是结果将取决于系统内部对不同字符的排列次序,对于单个字符的比较,运算符比较两个字符在字符集中的次序; 对于多个字符比较,他将比较两个字符串中第一个出现的不同字符。
> 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'大。
</p>