Welcome Guest ( Log In | Register )

欢迎访问本站。游客仅能浏览首页新闻、版块主题、维基条目与资源信息,需登录后方可获得内容发布、话题讨论、维基编辑与资源下载等权限。若无账号请先完成注册流程。
 
Reply to this topicStart new topic
> Lua入门:变量,函数与表, 其实在Lua里,它们都是变量
bx_bob
2011-08-02, 12:20
Post #1


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 817
   15

Group: Avatar
Posts: 416
Joined: 2007-07-25
Member No.: 14794


--------------------
变量
--------------------

在之前的例子里,出现过
CODE
b=3+5
用程序员的语言来说,b是一个变量,"="、"+"是运算符,3、5是常量。

变量的名字基本上可以随便起,除了个别的几个语法指令。一般来说变量名要和这个变量的作用相关,便于记忆和与其他程序员沟通。(策划的话就是便于给程序看啦。)
以这个为原则,刚才的某个例子就应该这么写:
CODE
pre_string="我有"
apple_quantity=3+5
pos_string="个苹果"
print(pre_string..apple_quantity..pos_string)
你没有猜错,这个程序和原来的结果一模一样。所以变量名的主要作用就是为了好认。
如果你够蛋疼,可以把lua文件存为utf-8格式,然后就可以用中文变量名了,更好认。(但是输入好复杂)
CODE
apple_quantity=3+5
说到这个语句的具体意思,其实就是把等号右边的式子进行计算,然后把结果扔进左边的变量里。嗯,这里放进apple_quantity的是8。
而用引号框起来的内容,叫做字符串,
CODE
apple_quantity="3+5"
这样写的话,放进apple_quantity的就是"3+5"了。如果你再运行程序,输出就成了"我有3+5个苹果"。(在程序员交流的时候,为了避免歧义,会在字符串外面加上引号,而在表达真的包含引号的字符串的时候,会在引号前面加上\,比如"he said: \"NO!\""。蛋疼不?)

» Click to show Spoiler - click again to hide... «


--------------------
函数
--------------------
CODE
print(pre_string..apple_quantity..pos_string)
在这么一句里,print()就是函数,pre_string..apple_quantity..pos_string是传递给函数的变量,print则是函数名。
Lua的一个特别之处就在于,函数其实也是变量的一种。这个后面再说。
print()是lua解释器内建的一个函数,你可以在说明书中找到他的说明。(在第五章,第一节Base Function里。)
他的作用就是把传递给他的变量转换成字符串并显示在屏幕上。

实际上除了内建函数,我们还可以自定义自己的函数。
还是以苹果那个为例子好了。
CODE
function print_apple(quantity)
    print("我有"..quantity.."个苹果")
end

apple_quantity=3+5
print_apple(apple_quantity)
运行结果是,没错,"我有8个苹果"。
函数部分要细说的话,还有很多很多,我准备留到后面专门的章节再说。

*Lua中,函数名也是变量名,所以有一个需要注意的地方:如果给函数包括系统函数,比如print,赋予一个值,那么它就不再是一个函数了。这样做有一个好处:程序员可以很方便地重构系统函数,比如sys_print=print print=myprint。但是缺点就是必须得小心选择变量名,因为没有声明的过程,会不小心覆盖掉原来的变量。

这里需要重点重申一下,
CODE
a=print()
这样的语句是调用print()函数,没有参数(屏幕上显示一个空行),并且将函数的返回值传递给a(print永远只会传nil,所以a变成了nil)。

CODE
a=print
这样的语句是把print传递给a,也就是a也变成了一个和print一样的函数了,从此你可以a("输出"),这样和print("输出"),是一个效果。


--------------------

--------------------
表是Lua的灵魂,是当中最灵活,最多变(也就是最复杂)的部分。
CODE
a={}
这样就声明了一个表。表的作用是,在当中储存许多个变量,比如说:
CODE
bx={
  "男人",
  status="活的",
  finger={
    left=5,
    right=5
    },
  totalfinger=function(self) return self.finger.left+self.finger.right end
}
看起来是不是很复杂?如果在这段程序后面加上
CODE
print("BX是一个"..bx.status..bx[1]..",他一共有"..bx:totalfinger().."只手指")
屏幕上将会显示:
QUOTE
BX是一个活的男人,他一共有10只手指

在这里,bx[1]表示引用bx表里面的第一个变量("男人"),bx.status表示引用key是status的变量("活的"),你可以随意往这个表里面添加一些变量并且尝试一下效果。
bx[1]里面的1,程序员把它叫做下标。bx.status也可以写成bx["status"],这个叫做字符串下标。
» Click to show Spoiler - click again to hide... «
接下来是比较复杂的bx:totalfinger()
用冒号调用一个函数,意思是把自己作为第一个变量传递给函数,也就是说这个写法其实和
bx.totalfinger(bx)
是一个意思。
而totalfinger()这个函数,则把它第一个参数(是一个表)里的叫finger的表的left和right两个值加起来,也就是5+5,返回10个。
» Click to show Spoiler - click again to hide... «

This post has been edited by bx_bob: 2012-06-09, 23:19
TOP
BGM
2012-03-20, 13:01
Post #2


主物质者
Group Icon
 5
   0

Group: Primer
Posts: 5
Joined: 2012-03-16
Member No.: 47793


QUOTE(bx_bob @ 2011-08-02, 12:20) [snapback]134744[/snapback]


bx[1]里面的1,程序员把它叫做下标。bx.status也可以写成bx.["status"],这个叫做字符串下标。
[spoiler]在lua以外的几乎所有语言中,数字下标都是从0开始的,这是因为内存地址的分配方式(也许)。总之还是从1开始比较符合人类习惯。而在一些面向对象语言当中,bx.status这种变量,叫做bx对象的属性。
楼主 关于这里的字符串下标有一点问题,我将bx.status改成bx.["status"]后程序出错了。。。
报错内容是:

lua: fringers.lua:11: '<name>' expected near '['

我的程序是:
bx={"man",
"woman",
status="alive",
fringer={
left=5,
right=4
},
totalfringer=function(self)
return self.fringer.left+self.fringer.right end
}
print("bx is a "..bx.["status"]..bx[2]..",he has "..bx:totalfringer().." fringers")
TOP
bx_bob
2012-06-09, 23:19
Post #3


比非主流还非主流的Lua原教旨主义机械师
Group Icon
 817
   15

Group: Avatar
Posts: 416
Joined: 2007-07-25
Member No.: 14794


不好意思今天才看到问题
bx["staus"]
中间没有点。
我写错了!
TOP
Fast ReplyReply to this topicStart new topic
 


Time is now: 2021-09-18, 01:27