在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Programming in Lua (第一章---起步) 管理提醒:本帖被 lua china 从 lua新手入门 移动到本区(2008-12-01) #
print(fact(a)) 如果你将Lua嵌入到一个应用程序中运行,比如CGILua 或者 IUPLua,你需要读一下相关的手册(或请教一下能人)去了解如果运行你的程序。不过,Lua还是Lua,无论以哪种方法使用,我们在这里看到的大多数东西都还是有效的。我们推荐你使用独立的Lua解释器(一个名为lua的程序)来运行你的第一个练习程序。 1.1 程序块 Lua执行的每一段代码,比如一个文件甚至交互模式下的一行指令,都可以称为是一个“程序块”。简单来说,“程序块”就是一组语句序列。 语句的结尾加分号的写法是可选的。一般来说,我只是在把多个Lua语句写在同一行的时候,才用分号间隔,当然,这是一个习惯问题。换行符同样可以用来分隔语句。举例来说,下面这四种写法都是正确的,而且等效。 # a = 1 # b = a*2 # a = 1; # b = a*2; # a = 1 ; b = a*2 # a = 1 b = a*2 -- 不推荐这种写法,不过确实可以这样写。 程序块可以简单到只有一条语句,像那个”Hello world”的例子,也可以是一组语句和函数的混合体,像前面的求阶乘的例子。你想让一个程序块有多大,它就可以有多大。因为Lua也被用作是一种“描述数据的语言”,所以,几兆字节尺寸的程序块并不鲜见。Lua解释器处理这些毫无问题。 除了将你的程序写进一个文件以外,你还可以使用Lua解释器提供的交互模式。如果你启动lua时不带任何参数,你就会看到这样的提示符: # Lua 5.0 Copyright (C) 1994-2003 Tecgraf, PUC-Rio # > 然后,你键入的任何指令(比如 print “Hello World”)会在你按下回车后被立即执行。如果想离开交互模式的解释器,只需要键入一个“文件结束符”(在Unix系统中是Ctrl-D,DOS/Windows中是Ctrl-z),或者调用OS库的退出函数(键入:os.exit() ) 在交互模式下,Lua一般将每一行都看作是一个程序块。但是,如果它检测到这一行无法构成一个完整的程序块,它就会等待进一步的输入,直到其构成了完整的程序块。当Lua等待进一步的输入时,它会显示一个不同的提示符(一般是>>)。因此,你可以直接在交互模式下输入多行的定义式,就像那个求阶乘的factorial函数。当然,在一些情况下,将这些程序写入文件,再用Lua执行这个文件更方便一些。 你可以让通过 –l 参数让Lua解释器顺序地执行一组脚本程序。举例来说,如果你有一个文件a,里面只有一条语句:x=1,你还有一个文件b,里面也只有一条语句:print(x),则命令 # promt> lua –la –lb 会依次运行a和b,并打印出“1”。( -l 参数实际上调用了 require 函数,这个函数会查找指定路径下的文件。所以,在前面那个例子中,如果你不写明a和b的路径,就无法正常运行。我们将在8.1节详细讨论require函数) 你可以使用 –i 参数告诉Lua解释器在执行完指定文件后,进入交互模式。比如: # prompt> lua -i -la -lb 将先执行a中的程序块,然后执行 #
> n = norm(3.4, 1.0) # > print(twice(n)) --> 7.0880180586677 dofile 函数在你进行单元测试时也是有用的。你可以同时打开2个窗口:一个是文本编辑器的窗口,可以在里面编辑你的程序(假设叫prog.lua),然后在另一个窗口打开Lua为交互状态。我们修改并保存程序后,你可以在交互环境下执行语句 dofile(“prog.lua”),它可以读入编辑后的程序。这样,你就可以检验你的新代码是否正确了。 1.2 全局变量 全局变量不需要特别声明。你只要简单地给一个全局变量赋值,就可以创建它。访问一个未经初始化的变量也不会有错,你只会得到一个nil的值而已。 # print(b) --> nil # b = 10 # print(b) --> 10 一般来说你不必删除全局变量。如果你希望变量的作用域受限制,你应该创建一个局部变量。但是,如果你真的想删除一个全局变量,只需要给它赋一个nil 就可以了。 # b = nil # print(b) --> nil 当执行上面两条语句后,变量b就不存在了。换句话说:一个全局变量,只有当它的值为非空(即不是nil)的时候,它才是存在的。 1.3 一些命名规定 Lua中的标识符可以是字母、数字和下划线的组合,但是不能以数字开头。比如: # i j i10 _ij # aSomewhatLongName _INPUT 你应该避免标识符的名字以下划线(_)开头且后面紧跟大写字母(如 _VERSION),它们在Lua中是为特殊用途保留的。一般情况下,我将以下划线开头的名字保留给虚变量用。 在Lua中,“字母”的概念依语言环境而定。因此,在一些语言环境下,你可以用índice 或 ação 这样的名字。但是,这样的命名可能会导致你的程序在不支持该语言环境的系统下无法运行。 下面这些单词是保留字,我们不能将它们用作标识符: # and break do else elseif # end false for function if # in local nil not or # repeat return then true until # while Lua是大小写敏感的:and 是保留字,而And和AND则是另外两个不同的标识符。 注释可以在任何地方以两个横线(--)开始,注释的区域将持续到一行的结尾。Lua还提供了块注释的语句,它以 --[ 开始,以 ]]结束。介绍一个常用的伎俩:当我们想注释掉一段代码时,就可以这么写: # --[[ # print(10) -- 这句被注释掉了 # --]] 如果我们在第一行加一个横线,则注释将失效: # ---[[ # print(10) --> 10 # --]] 在第一个例子里,最后一行上我们使用了 -- ,在第二个例子中,---[ 进入lua交互状态后,你就会发现,提示符由“>”变成了“lua>”。
在开始运行前,lua会寻找一个名为LUA_INIT的环境变量。如果存在这个变量,且其内容为@filename,lua会读入这个文件。如果定义了 LUA_INIT但是并非以’@’开头,lua就认为这个变量的内容是一组语句,并且会运行它。这个参数给了用户配置Lua解释器的强大能力。你可以预读入一些包、修改提示符和路径、定义自己的函数或者重命名、删除函数等。 Lua支持命令行参数。传入的命令行参数会以一个名为arg的全局数组来保存。这个数组以命令行上的“主脚本文件名”为坐标原点。举例来说,如果命令行为: # Prompt> lua ./hello.lua a b c 则会有一个如下的数组: # arg[-1] = lua # arg[0] = ./hello.lua # arg[1] = a # arg[2] = b # arg[3] = c 如果我们在主脚本文件名前加入其它的参数,则arg的坐标原点也相应会变化。比如,将刚才的命令行改为: Prompt> lua –e “sin=math.sin” ./hello.lua a b c 则arg数组的内容则变为: # arg[-3] = lua # arg[-2] = -e # arg[-1] = sin=math.sin # arg[0] = ./hello.lua # arg[1] = a # arg[2] = b # arg[3] = c 所以说:无论何时,主脚本(这里是./hello.lua)的arg下标永远是0。一般来讲,脚本中只使用下标是正数的arg数组成员 |
请发表评论