青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

::^喬喬^::明鏡臺::原創空間::C#.NET2.0,C++技術BLOG
人最重要的是心境,一顆平靜安穩的心才能更好的進步,保持自己的心態.成為夢想中的高手QQ群:8664695
posts - 17,comments - 32,trackbacks - 0

1、lua學習之入門(一)----環境搭建

2、lua學習之入門(二)----基礎語法1

3、lua學習之入門(二)----基礎語法2

4、lua學習之入門(三)----函數

???? 在LUA里函數是個十分重要的內容,因為我們實際開發的時候,用的最多的就是函數,用函數是封裝各個實現,在Q群里曾經聽一些大蝦說過,寫LUA必須要懂得閉包,常用系統函數,還有范型for寫迭代器,最后就是編譯和運行還有錯誤信息.其實這章,我就卡了一下殼,卡殼的地方在閉包,因為我沒有完全理解閉包的作用,和閉包的好處,網上也沒有明確的說明閉包的優劣,所以閉包的概念,我也只能以個人感覺去寫,如果我說得不對,歡迎賜教.如果對閉包理解很深,歡迎來指教...你要偶拜你為師也行,達者為師啊,偶很好學的.

函數有兩種用途:1.完成指定的任務,這種情況下函數作為調用語句使用;2.計算并返回值,這種情況下函數作為賦值語句的表達式使用。

?? 其實我們接觸最早的,就是函數,還記得我們的第一個LUA嗎?print();這就是一個函數.可以理解****()都可以當做是函數,其實大部分編程語言的函數都是以這個方式一共調用的.認識了什么是函數,那么我們就自己編寫一個函數吧

function?maxFun(a , b)
???
if ?a > b?then
???
return ?a;
???
else
?????
return ?b;
??end
end

-- 我們用一個輸出語句把我們的函數結果顯示出來 , 證明我們寫的函數沒有問題

print (maxFun( 4 , 3 ));
上面這個函數
, 其實很簡單就是比較兩個數的大小 . 最后運行的結果我們得到結果是4 , 這里使用的是函數的第1種任務 , 判斷兩個數的大小 , 在LUA里函數是可以返回多個值的 , 這個點和其他編程語言有很大的區別 , 那就很容易造成錯覺 , 多個返回值 , 那我如何獲得各個返回值呢 ? 看例子

function?returnAnyValue()
????????
return ? 1 , 2 , 3 , 4 ;
???end

????a
, b , c , d? = ?returnAnyValue();
e
, f , g? = ?returnAnyValue();
h
, i , j , k , l? = ?returnAnyValue();

-- [[
print ( " a: " .. a .. " ?b: " .. b .. " ?c: " .. c .. " ?d: " .. d .. " ?e: " .. e .. " ?f: " .. f .. " ?g: " .. g .. " ?h: " .. h .. " ?i: " .. i .. " ?j: " .. j .. " ?k: " .. k .. " ?l: " .. l .. " ?! " );
]]
-- 這樣編譯是出錯的 , 提示告訴我們l為nil不能輸出 .

-- 所以我們把程序修改為

print ( " a: " .. a .. " ?b: " .. b .. " ?c: " .. c .. " ?d: " .. d .. " ?e: " .. e .. " ?f: " .. f .. " ?g: " .. g .. " ?h: " .. h .. " ?i: " .. i .. " ?j: " .. j .. " ?k: " .. k .. " ?! " );

結果如下
:
???a
: 1 ?b : 2 ?c : 3 ?d : 4 ?e : 1 ?f : 2 ?g : 3 ?h : 1 ?i : 2 ?j : 3 ?k : 4


雖然我們不能輸出L的值,但是我們根據錯誤提示可以知道l的值是nil的.

論述完返回值,那么我們要看參數數了,LUA支持可變參數的模式的使用的方法和C語言的差不多,不熟悉的可以先學C語言,畢竟我看到的LUA大多數都是嵌入C中的,所以C/C++至少你要會.

好了我們要進入我覺得比較難的點:閉包

在我接觸的編程語言里,其實還沒發現過閉包的概念,坦白的說一句,就是LUA我才接觸閉包的.閉包從網上的資料來看,就是JAVASCRIPT里的匿名函數的使用(我接觸新語言的時候,總喜歡用自己接觸過的語言去進行對比,去學習.我覺得這種學習的方法還是比較有效果的,有興趣的朋友也可以試試這個方法.),在我看了網上公開的閉包程序,最大的特點就是使用,外面的函數有自己的局部變量,內部的匿名函數使用了外部函數的局部變量.有點像面向對象思想里的意思,后來我在LUA的一個論壇看到一篇關于閉包的定義,如下:

當一個函數內部嵌套另一個函數定義時,內部的函數體可以訪問外部的函數的局部變量,這種特征我們稱作詞法定界。雖然這看起來很清楚,事實并非如此,詞法定界加上第一類函數在編程語言里是一個功能強大的概念,很少語言提供這種支持。
技術上來講,閉包指值而不是指函數,函數僅僅是閉包的一個原型聲明

這個是我在網上找的一個關于閉包的例子,個人感覺水平有限.可能使用網上的例子更有說服力

下面看一個簡單的例子,假定有一個學生姓名的列表和一個學生名和成績對應的表;現在想根據學生的成績從高到低對學生進行排序,可以這樣做:

names?
= ?{ " Peter " , ? " Paul " , ? " Mary " }

grades?
= ?{Mary? = ? 10 , ?Paul? = ? 7 , ?Peter? = ? 8 }

table
. sort (names , ?function?(n1 , ?n2)

????
return ?grades[n1]? > ?grades[n2]???? -- ?compare?the?grades

end)
假定創建一個函數將上面的功能包裝起來

???function sortbygrade (names, grades)

?? ??? table.sort(names, function (n1, n2)

????????? return grades[n1] > grades[n2]??? -- compare the grades

??? end)

end
例子中包含在sortbygrade函數內部的sort中的匿名函數可以訪問sortbygrade的參數grades,在匿名函數內部grades不是全局變量也不是局部變量,我們稱作外部的局部變量(external local variable)或者upvalue。(upvalue意思有些誤導,然而在Lua中他的存在有歷史的根源,還有他比起external local variable簡短)。


這個例子主要說明的是在外部函數和內部函數之見參數的使用,函數中就可以直接用變量進行傳值,這里需要說明一下的是table.sort(存放元素的數組,排序函數)具體的等后面我介紹常用庫的時候說.只要知道是表排序就好.

函數就寫出來的,但是我們需要更直觀的看到這些資料
所以我在最下面加上了如下代碼

print ( " --------- " )
sortbygrade?(names
, ?grades);

for ?v?in?pairs(names)? do

print (names[v])
end
輸出結果為
Mary
Peter
Paul
我將grades = {Mary = 7, Paul = 8, Peter = 9}改了再看效果
Peter
Paul
Mary

function?newCounter()

????
local?i?=?0

????
return?function()?????--?anonymous?function

???????i?
=?i?+?1

????????
return?i

????end

end

?

c1?
=?newCounter()

print(c1())??-->?1

print(c1())??-->?2

print(c1())??-->?3

結果代碼里已經顯示了,我就不說了,但是大家看到這個結果?你想到了什么?
對象?就是對象,看以下C#代碼
public?class?CC
{
????
private?int?a;

????
public?CC()
????
{
???????a
=0;
????}


????
public?int?newCounter()
????
{
???????
this.a=this.a+1;
???????retrun?
this.a;
????}

}

如果LUA代碼里C1=newCounter();C2=newCounter()
?print(c2())--->1
是不是跟我們聲明一個對象十分的類似呢?所以我推斷閉包在一定程度上實現了部分面向對象的功能,肯定有一定的差別的,我只是說類似..而且我看代碼有點像C語言去實現面向對象的感覺...

閉包還可以實現類似JAVA里沙箱的功能,(來自網上,我并沒有運行這段代碼)
do

????local?oldOpen?
=?io.open

????io.
open?=?function?(filename,?mode)

???????
if?access_OK(filename,?mode)?then

???????????
return?oldOpen(filename,?mode)

???????
else

???????????
return?nil,?"access?denied"

???????
end

????
end

end

*正確的尾調用
這個迷宮游戲是典型的狀態機,每個當前的房間是一個狀態。我們可以對每個房間寫一個函數實現這個迷宮游戲,我們使用尾調用從一個房間移動到另外一個房間。一個四個房間的迷宮代碼如下:

function?room1?()

????local?move?
=?io.read()

????
if?move?==?"south"?then

???????
return?room3()

????elseif?move?
==?"east"?then

???????
return?room2()

????
else

???????
print("invalid?move")

???????
return?room1()???--?stay?in?the?same?room

????
end

end

?

function?room2?()

????local?move?
=?io.read()

????
if?move?==?"south"?then

???????
return?room4()

????elseif?move?
==?"west"?then

???????
return?room1()

????
else

???????
print("invalid?move")

???????
return?room2()

????
end

end

?

function?room3?()

????local?move?
=?io.read()

????
if?move?==?"north"?then

???????
return?room1()

????elseif?move?
==?"east"?then

???????
return?room4()

????
else

???????
print("invalid?move")

???????
return?room3()

????
end

end

?

function?room4?()

????
print("congratilations!")

end

我們可以調用room1()開始這個游戲。

如果沒有正確的尾調用,每次移動都要創建一個棧,多次移動后可能導致棧溢出。但正確的尾調用可以無限制的尾調用,因為每次尾調用只是一個goto到另外一個函數并不是傳統的函數調用
(以上代碼來源網上)
正確尾調用論述的意義在于..棧溢出的問題,不正確的尾調用是存在棧溢出問題的.

這篇寫的我自己都不是很滿意...因為這個東西..需要點時間消化...等我消化了再來整理一下,就好象開頭,我也是一個LUA新手,我只能把我認識的弄出來,而且正確上..也非絕對..其實我的目的只是傳播我的學習的思想.

明鏡臺
posted on 2009-05-14 13:14 ^喬喬^ 閱讀(2097) 評論(0)  編輯 收藏 引用 所屬分類: Lua學習筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲女同在线| 欧美成人久久| 亚洲电影免费观看高清完整版| 亚洲天堂网站在线观看视频| 日韩视频在线观看一区二区| 亚洲人成在线观看| 亚洲国产免费看| 99精品免费网| 亚洲欧美一区在线| 久久人人97超碰人人澡爱香蕉| 亚洲视频第一页| 亚洲一区二区视频| 久久成人国产| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲一区二区三区四区在线观看| 亚洲作爱视频| 久久国产精品久久久久久电车| 久久一区免费| 一本色道久久加勒比精品| 亚洲欧美在线网| 欧美国产在线观看| 国产欧美三级| 亚洲精选成人| 久久嫩草精品久久久精品一| 亚洲精品一品区二品区三品区| 亚洲一区二区三区高清不卡| 免费不卡中文字幕视频| 国产精品美女久久久久aⅴ国产馆| 国产色婷婷国产综合在线理论片a| 亚洲国产精品一区二区尤物区| 亚洲图片欧美一区| 欧美国产精品v| 午夜精品福利一区二区蜜股av| 欧美激情偷拍| 亚洲第一视频网站| 久久国产毛片| 国产精品99久久久久久久vr| 久久久欧美精品| 国产欧美日韩另类一区| 欧美不卡视频一区发布| 亚洲欧美成人一区二区在线电影| 欧美激情一区二区三级高清视频| 韩国av一区二区三区| 亚洲欧美日韩综合一区| 亚洲精品裸体| 欧美成人蜜桃| 伊人激情综合| 久久久欧美一区二区| 亚洲淫性视频| 国产精品久久久99| 一区二区欧美亚洲| 91久久久亚洲精品| 欧美成人免费观看| 亚洲二区视频在线| 国产欧美精品久久| 亚洲欧美日韩一区二区| 亚洲视频在线免费观看| 国产精品ⅴa在线观看h| 在线视频免费在线观看一区二区| 91久久久在线| 欧美人牲a欧美精品| 日韩写真视频在线观看| 亚洲精品乱码久久久久久蜜桃91| 国产亚洲精品美女| 久久黄色小说| 欧美在线三区| 狠狠久久亚洲欧美专区| 久久精品视频在线看| 久久成年人视频| 一区二区三区无毛| 免费欧美在线| 欧美激情视频一区二区三区在线播放| 亚洲精选视频免费看| 亚洲精品乱码久久久久久黑人 | 久久久福利视频| 久久精品国产99国产精品| 在线精品在线| 91久久精品网| 欧美日韩亚洲另类| 欧美一区二区黄| 久久久久久穴| 亚洲精品国产视频| 亚洲视频在线观看视频| 国产精品综合色区在线观看| 久久伊人亚洲| 欧美日韩国产综合网| 久久av一区二区三区| 久久久久久一区二区| 最新国产成人av网站网址麻豆| aa国产精品| 激情视频亚洲| 中文有码久久| 亚洲高清在线精品| 亚洲性感美女99在线| 亚洲国产黄色| 夜夜嗨av一区二区三区| 一区二区三区在线视频免费观看| 亚洲精品免费在线播放| 国产精品久久久久久户外露出| 免费日韩一区二区| 国产精品一区在线观看| 亚洲国产女人aaa毛片在线| 欧美性猛交xxxx乱大交蜜桃| 久久精品视频在线| 欧美日韩国产综合一区二区| 猫咪成人在线观看| 国产精品免费一区二区三区在线观看 | 免费欧美在线视频| 欧美一区二区私人影院日本| 麻豆精品传媒视频| 午夜一区二区三区在线观看| 蜜臀久久久99精品久久久久久| 久久精品成人| 国产精品亚洲网站| 日韩午夜激情| 亚洲乱码国产乱码精品精可以看| 午夜久久资源| 亚洲欧美国产高清| 欧美精品激情在线| 欧美承认网站| 狠久久av成人天堂| 国产一区二区| 国产日韩欧美精品| 亚洲欧洲一区二区在线观看| 国产欧美在线| 一区二区日韩精品| 一区二区三区欧美视频| 久久亚洲综合| 久久久久久久国产| 国产一区二区欧美| 校园春色国产精品| 欧美在线观看一二区| 国产精品九九| 99精品国产福利在线观看免费| 亚洲激情视频在线| 另类专区欧美制服同性| 免费成人在线观看视频| 在线观看福利一区| 久久五月激情| 欧美成人黑人xx视频免费观看| 很黄很黄激情成人| 久久精品亚洲| 久久久精品网| 在线成人www免费观看视频| 久久精品国产2020观看福利| 久久免费视频一区| 亚洲国产精品久久人人爱蜜臀| 免费观看成人网| 亚洲国产天堂久久综合网| 亚洲激情电影中文字幕| 欧美国产日韩一区二区在线观看| 亚洲欧洲日本一区二区三区| 99在线|亚洲一区二区| 欧美激情无毛| 亚洲性视频h| 乱中年女人伦av一区二区| 亚洲激情小视频| 欧美性开放视频| 欧美一区二区三区四区夜夜大片| 久久伊伊香蕉| 99国产精品久久久久久久成人热| 欧美午夜剧场| 香蕉av777xxx色综合一区| 免费看亚洲片| 制服丝袜激情欧洲亚洲| 国产午夜精品久久久久久久| 蜜臀a∨国产成人精品| 亚洲婷婷在线| 欧美成人精品一区| 亚洲男人影院| 在线免费观看日本欧美| 欧美日韩精品一区二区在线播放| 亚洲在线一区二区三区| 美女成人午夜| 亚洲欧美日韩另类精品一区二区三区| 韩国一区二区在线观看| 欧美日韩国产成人在线91| 亚洲综合色噜噜狠狠| 欧美国产精品中文字幕| 欧美亚洲视频一区二区| 亚洲精品社区| 国产亚洲精品久久飘花| 欧美人与禽猛交乱配视频| 欧美亚洲在线| 9国产精品视频| 你懂的国产精品永久在线| 午夜精彩国产免费不卡不顿大片| 亚洲国产精品一区二区三区| 国产精品综合视频| 欧美日产国产成人免费图片| 久久精品一二三区| 亚洲欧美日韩视频二区| 亚洲精品少妇| 欧美黄色一级视频| 国产又爽又黄的激情精品视频| 亚洲国产另类久久精品| 亚洲精品国久久99热| 欧美日韩另类国产亚洲欧美一级| 蜜臀a∨国产成人精品| 极品中文字幕一区|