练习1.1:运行阶乘的实例并观察,如果输入的是负数,程序会出现什么问题?试着修改代码来解决问题
function fact(n) if n==0 then return 1 else return n*fact(n-1) end end print("enter a number") a=io.read("*n") print(fact(a))
解:
输入负数程序会无限递归至栈溢出,新的方案
local function fact(n) if n < 0 then print("invalid n") return end if n == 0 then return 1 else return n * fact(n - 1) end end
function fact(n) if n<0 then return -1 elseif n==0 then return 1 else return n*fact(n-1) end end print("enter a number") a=io.read("*n") print(fact(a))
练习1.2:分别使用 -i 参数和 dofile 加载脚本并运行twice示例,你更喜欢哪种方式?
-- 第一种 -- lua.exe -i chapter01/chapter01.lua -- ->twice(2) -- 第二种 -- 直接运行lua.exe -- ->dofile("chapter01/chapter01.lua") -- ->twice(2) --chapter01文件 function twice(x) return 2.0 * x end
解:
个人比较喜欢dofile函数的方式,比较灵活
练习1.3 :你能否列举出其他使用 "--" 作为注释的语言
解:
AppleScript、SQL类语言
练习1.4:以下字符串中哪些是有效的标识符
local ___ = "valid" local _end = "valid" local End = "valid" --local end = "invalid" --local until? = "invalid" --local nil = "invalid" local NULL = "valid" --one-step = "invalid"
解:
___ _end End NULL
练习1.5:表达式 type(nil) == nil 的值是什么?(你可以运行代码来检查下答案)你能解释下原因吗?
解:
print(type(nil) == nil ) --false type函数将 nil 转为了 "nil" 字符串
练习1.6:在不使用函数type的情况下,你如何检查一个值是否为boolean类型?
解:
--检查变量 value的值是否为 boolean 类型,只需检查是否为 true 和 false 即可。
local function isBool(value) return value == true or value == false end print(isBool(false)) print(isBool(true)) print(isBool(1)) print(isBool(nil)) print(isBool("true")) print(isBool("false"))
练习1.7:考虑如下的表达式。其中的括号是否是必需的? 你是否推荐在这个表达式中使用括号
(x and y and (not z)) or (( not y) and x)
解:
不是必需的,但推荐用括号,以增强可读性
练习1.8:请编写一个可以打印出脚本自身名称的程序(事先不知道脚本自身名字)
解:
解释器执行的脚本文件名存储在 arg[0] 中
if arg and arg[0] then print(arg[0]) end
文件名可能是一个绝对地址的形式,因此需要用string.find函数进行简单的模式匹配。
findfilename=string.find(arg[0],"[^\\/]-$") getfilename=string.sub(arg[0],findfilename) print(getfilename)