目录
注:本系列为《Lua程序设计-第4版》的读书笔记,其中的见解有不完善的地方可以在评论区指出,原版请看图书
一. Hello World
二. 定义一个计算阶乘的函数
三. 语法规范
四. 类型和值
1. nil
五.逻辑运算符and or not
拓展一:短路取值
拓展二:三元运算符
需求:使用逻辑运算符选出 x和y中较大的一个,并解释其原理
注:本系列为《Lua程序设计-第4版》的读书笔记,其中的见解有不完善的地方可以在评论区指出,原版请看图书
遵照惯例,我们的第一个Lua程序是通过标准输出打印字符串"Hello World":
print("Hello World")
--定义一个计算阶乘的函数
function fact(n)
if n == 0 then
return 1
else
return fact(n - 1)*n
end
end
print("enter a number:")
a = io.read("*n") --读取一个数字
print(fact(a)))
Ⅰ. Lua语言中的标识符(或名称)是由任意字母、数字和下划线组成的字符串(注意:不能以数字开头),例如:
i j i10 _ij
aSomeWhatLongName _INPUT
Ⅱ. "下划线 + 大写字母" (例如_VERSION)组成的标识符通常被Lua语言用作特殊用途,应避免将其用作其他用途。
Ⅲ. 以下是Lua语言的保留字,不能用作标识符:
and |
break |
do |
else |
elseif |
end |
false |
goto |
for |
function |
if |
in |
local |
nil |
not |
or |
repeat |
return |
then |
true |
until |
while |
Ⅳ. Lua语言中使用两个连续的连字符(--) 表示单行注释的开始,使用两个连续的连字符加两对连续左方括号表示长注释或多行注释的开始(直到两个连续的右括号为止,中间都是注释),例如
--[[
多行长注释
]]
--添加长注释
--[[
print(10)
]]
--启动注释中的代码
---[[
print(10) ---> 10
]]
Lua语言是一种动态类型语言(Dyanmically-typed language),在这种语言中没有类型定义,每个值都带有其自身的类型信息。
Lua语言中8种基本类型:nil( 空 )、boolean( 布尔 )、number ( 数字 )、string(字符串)、userdata( 用户数据 )、function(函数)、thread(线程)和 table( 表 )。
使用函数type 可获取一个值对应的类型名称:
> type(nil) --> nil
> type(true) -->boolean
> type(10.4 * 3) --> number
> type("Hello world") --> string
> type(io.stdin) --> userdata
> type(print) --> function
> type(type) --> thread
> type({}) --> table
> type(type(X)) --> string (不管X是什么,最后一行返回的永远是“”string ”。这是因为函数type的返回值永远是一个字符串)。
Boolean类型具有两个值。true 和 false ,它们分别代表了传统布尔值。
不过,在Lua语言中,Boolean值并非是用条件判断的唯一方式,任何值都能表示条件。在Lua语言中条件测试把 Boolean值false和nil之外的所有值都视为真。
特别是,在条件检测中,lua把零和空字符串也视为真
和条件测试一样,所有逻辑运算符把false 和nil视为假,其他值视为真。
逻辑运算符and运算结果为:如果它的第一个操作数为 false,返回第一个操作数,否则返回第二个操作数。
逻辑运算符or运算结果为:如果它的第一个操作数不为 false,返回第一个操作数,否则返回第二个。
-> 4 and 5 -->5
-> nil and 13 -->nil
-> false and 13 -->false
--> 0 or 5 --> 0
--> false or "hi" -->"hi"
--> nil or false --> false
and 和 or 都遵循 短路求值原则,即只在必要时才对第二个操作数进行求值。
例如:
表达式(i ~= 0 and a/i>b) 不会发生运行时异常(当i 等于0时,a/i不会执行)
在Lua语言中,形如 x = x or v 的惯用写法非常有用,它等价于:
if not x then x = v end
表达式形如
--由于and的运算符优先级高于or ,所以这两种表达形式等价,当b不为false时,下面表达式等价于 C语言的三目运算符 a?b:c
(a and b) or c
a and b or c
(x>y) and x or y
原理:
当x>y成立时,and的第一个操作数是 true,与第二个操作数(x)进行 and运算后结果为x, 最终与or运算后返回第一个操作数x
当x>y 不成立时,and表达式的值为false,最终or运算后的结果是第二个操作数y