Welcome Guest ( Log In | Register )

欢迎访问本站。游客仅能浏览首页新闻、版块主题、维基条目与资源信息,需登录后方可获得内容发布、话题讨论、维基编辑与资源下载等权限。若无账号请先完成注册流程。
 
Reply to this topicStart new topic
> Lua入门:程序逻辑, 其实是所有编程语言都通用的部分。
bx_bob
2011-08-02, 15:25
Post #1


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

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


------------
if...then...end
if...then...elseif...then...else...end
------------
if就是如果的意思,通常用来作为条件判断。
CODE
if a==nil 
  then print("NIL!")
else
  print(a)
end
这里的意思是,如果a等于nil,那么就输出"NIL!",否则(就是else),输出a的内容。
当a没有值的时候,它就是nil,你可以给a先赋值,然后观察输出结果的变化。

在lua中,nil和false都当作条件不成立。其他都当作条件成立
» Click to show Spoiler - click again to hide... «
有时候脑子实在转不过来,可以很简单地试试
CODE
print(a==nil)
因为"=="是一个运算符,它判断符号两边的内容是否相同,并且返回true或者false。print()函数可以很直观地表现出这个运算结果。

除了==以外,还有>(大于),<(小于),~=(不等于)以及<=和>=,这些都很好理解,例如1<2显然是true。
还有 and (与),or (或), !(非)。这对于非理工的人来说也许有些难以理解。
and要求左右两边的逻辑都为true,才返回true。比如说 true and false 结果是false。 1==1 and "yes"=="yes"结果是true
or则是左右两边任何一个为true,结果就是true了,比如说true or false结果是true, false or nl结果是false
!则是将后面的逻辑取反,本来是true的变成了false,本来是false的变成了true。比如说 !(1==1)结果是false

总之这些确实很繁琐很让人头大(所以程序员的工资才那么高?),多用print分段调试有助理清思路。

elseif的作用是,在if后面的逻辑不成立的时候,再判断一次
而else是在逻辑不成立的时候直接执行这里。
CODE
if a==0 then print("零")
elseif a==1 then print("一")
else print("我懒得写了")
end
在这段程序前面给a赋0和1试试。

虽然说if后面填的是判断逻辑,但实际上填什么表达式都行,比如说
CODE
if a then print(a) end
这是因为 (IMG:style_emoticons/default/excl.gif) 在lua中,nil和false当作条件不成立。其他都当作条件成立,所以只要a不是nil或者false,都会被显示在屏幕上。
但是从一个程序员的角度来说,并不推荐使用简写的方式,比如"if a then"这样的写法容易让人忽略他的判断条件,写成"if a==nil then"更方便其他人阅读你的代码。
还有一点,在lua里面false==nil返回的是false

------------
while...do和repeat...until...
------------
了解上面的判断条件之后,这部分循环的就很简单了。
CODE
b=0
a=0
while a<=100 do
  a=a+1
  b=b+a
end
print(b)
猜猜显示的是什么?
while...do...end的作用是,除非while后面的条件不满足,要不就一直执行do到end之间的内容。
这里需要注意的是,while后面的条件只在do到end之间的内容全部执行一遍之后才判断一次。
所以上面这段程序显示的是5151,也就是1+2+3+...+100+101,如果猜错了只好好好想想这当中的过程。

除了让while后面的条件不满足,这个循环还有另一种写法:
CODE
b=0
a=0
while true do
  if a>100 then break end
  a=a+1
  b=b+a
end
print(b)
首先,由于while后面的判断条件永远为true,所以指望靠它结束循环已经不可能了。
这里新出现了一个break,他的作用是跳出这个循环。所以当a>100的时候,就直接离开了do...end之间的部分。
使用break,可以让你的循环有不止一个退出条件。
一个永远不退出的循环叫死循环

而repeat...until...的判断条件,写在until之后
CODE
b=0
a=0
repeat
  a=a+1
  b=b+a
until a>100
print(b)
和while...do的区别在于,until后面的判断条件满足的时候,就会退出循环。(while是不满足时,罗嗦了)
以及,无论until的条件是什么,repeat...until之间的代码都会至少执行一次。

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

---------------
for
---------------
for在lua中得到了特别的加强。
唉,为何lua最精华的部分总被我放在了每章的最后。

for命令总体来说有两种形式,一个是很经典的,数字自增
CODE
b=0
for i =1 , 100 do
    b=b+i
end
print(b)
结果和前面的例子一样,1,100 的意思是从1增加到100,每次增加1。5,100就是从5开始增加到100。这里还有第三个参数,用于更复杂的时候,1,100,3的意思是,从1开始到100,每次增加3,也就是
1,4,7...
也可以100,1,-1 这样的话就是从100到1,每次减1了。
但是我要说,总用for来做这种while和repeat都能做到的事情实在是太弱了!
CODE
test_table={
  bx="早餐",
  jox="午餐"
}

for i,j in pairs(test_table) do
  print(i.."没吃"..j)
end
出来的结果是
QUOTE
bx没吃早餐
jox没吃午餐
在这里,for...in...do...end和pairs()这个函数组合,就可以用来遍历表。
(遍历的意思,是逐个访问表中的条目的意思)
pairs()返回的是一个表里面所有条目,按照hash排列的顺序。这时候不管表的输入顺序为什么,都常会弄得一团乱。
另外有个函数叫做ipairs(),返回这个条目中以数字为下标,而且连续的条目,这样的话就可以保证顺序了。
除了这些函数意外,通过扩展,还可以用来方便地遍历很多东西,比如说数据库条目。



This post has been edited by bx_bob: 2011-08-03, 11:07
TOP
Fast ReplyReply to this topicStart new topic
 


Time is now: 2021-09-17, 23:43