1. Getting Started
开始使用
print("Hello World")
% lua hello.lua
命名
- 标识符、变量名:可包含大小写字母、数字、下划线,不能以数字开头。
- 避免下划线+大写字母,如
_VERSION。 - 大小写敏感
注释
print(10) -- 单行注释,两个减号开头
多行注释
--[[A multi-line
long comment
]]
块注释
--[[
print(10)
--]]
-- 快速解除注释
---[[
print(10)
--]]
类型
基础类型:nil、Boolean、number、string、function、userdata、thread、table
type(nil) --> nil
type(true) --> boolean
type(10.4 * 3) --> number
type("Hello world") --> string
type(io.stdin) --> userdata
type(print) --> function
type(type) --> function
type({}) --> table
type(type(X)) --> string
Nil
全局变量默认值为 nil。
Booleans
false 和 nil 为假值(false value),其他值为真值。
and: 如果第一个操作项为假,那么结果是第一个操作项;否则为第二个操作项。
> 4 and 5 --> 5
> nil and 13 --> nil
> false and 13 --> false
or: 如果第一个操作项不为假,那么结果是第一个操作项;否则为第二个操作项。
> 0 or 5 --> 0
> false or "hi" --> "hi"
> nil or false --> false
not: 返回布尔值。
> not nil --> true
> not false --> true
> not 0 --> false
> not not 1 --> true
> not not nil --> false
练习
1.1
function fact(n)
if n < 0 then
return nil
end
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))
1.2
-l选项(命令行选项)- 加载时机和目的
- 当使用
-l选项时,它是在Lua程序启动时加载指定的库文件。这个选项主要用于加载标准库或者自定义的库,这些库文件通常包含一些可以在整个程序中复用的函数和变量定义。例如,如果你有一个名为mylib.lua的库文件,里面定义了一些实用函数,使用lua -l mylib启动Lua解释器,它会在程序启动阶段就加载mylib.lua文件。
- 当使用
- 作用域和可见性
- 加载的库文件中的全局变量和函数在整个Lua脚本的全局环境中可见。这意味着一旦加载,在后续的脚本代码中,你可以直接调用库文件中定义的全局函数,就好像这些函数是在当前脚本中定义的一样。
- 错误处理和加载方式
- 如果指定的 库文件不存在或者在加载过程中出现语法错误等问题,Lua解释器可能会直接报错并终止程序启动。它是一种相对比较“强硬”的加载方式,因为它和程序的启动过程紧密相关。
- 应用场景举例
- 用于加载常用的数学库(如
math库)、字符串处理库等标准库。假设你要进行复杂的数学计算,在命令行使用lua -l math启动Lua解释器后,就可以直接在后续的脚本中使用math库中的函数,如math.sqrt()来计算平方根等操作。
- 用于加载常用的数学库(如
- 加载时机和目的
dofile函数- 加载时机和目的
dofile函数是在Lua脚本执行过程中的某个特定点加载文件。通常用于在需要的时候动态加载代码片段,比如根据程序的运行逻辑,只有在满足一定条件时才加载某个文件。例如,在一个游戏开发中,只有当玩家进入某个特定关卡时,才使用dofile加载该关卡对应的配置文件和脚本。
- 作用域和可见性
- 当使用
dofile加载文件时,文件中的全局变量和函数会被加载到当前的全局环境中。这和-l选项类似,但是dofile是在脚本运行过程中执行加载操作,所以加载后的变量和函数在加载后的脚本部分可以访问。
- 当使用
- 错误处理和加载方式
- 如果
dofile加载的文件不存在或者有错误,它会在执行dofile函数的地方报错,并且不会加载文件内容。不过,它不会像-l选项那样可能导致程序启动就失败,因为它是在脚本运行过程中加载的。例如,如果在一个try - catch(类似错误 处理机制)的代码块中使用dofile,可以对加载错误进行更灵活的处理。
- 如果
- 应用场景举例
- 用于加载游戏关卡配置文件、根据用户输入动态加载不同的模块等。比如在一个软件系统中,用户可以选择不同的功能模块,当用户选择某个模块时,通过
dofile加载该模块对应的Lua脚本文件来实现功能的动态扩展。
- 用于加载游戏关卡配置文件、根据用户输入动态加载不同的模块等。比如在一个软件系统中,用户可以选择不同的功能模块,当用户选择某个模块时,通过
- 加载时机和目的
1.3
使用 -- 作为注释的语言:
-- This is a comment in SQL
SELECT column1, column2
FROM your_table;
-- This is an Ada comment
procedure Hello is
begin
Put_Line ("Hello, world!");
end Hello;
-- This is a VHDL comment
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity my_entity is
-- Entity declaration code here
end my_entity;
1.4
___ = 10
_end = 20
End = 30
end = 40 -- mismatched input 'end' expecting <EOF>
until? = 50 -- token recognition error at: '?'
nil = 60 -- mismatched input 'nil' expecting <EOF>
NULL = 70
one-step = 80 -- no viable alternative at input 'one-'
1.5
type(nil) is "nil", not nil
1.6
function isBoolean(value)
return value == true or value == false
end
1.7
In conclusion, although the parentheses are not necessary for the correct evaluation of the expression based on Lua's operator precedence, it is highly recommended to use them to improve readability and maintainability.