阅读《Lua程序设计(第4版)》---1-1

练习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)

 

上一篇:openresty安装配置


下一篇:lua结合c/c++示例