|
|
開源博客OXITE,這個博客系統是使用ASP.NET MVC來實現,最新版本的是2009年2月15發布的。MVC并不是什么新東西,我研究OXITE主要的目的其實就是為了學習MVC而已。所以我們從結構上去分析這個東西,因為一次寫分析類的文章,可能寫的并不好。看到說得不準確的歡迎指出,一起進步嘛。
一、什么是Oxite;
Oxite是微軟發布的開源博客平臺。
Oxite平臺使用微軟公共許可(Microsoft Public License)授權方式,這是微軟經過開放源代碼促進會(OIS)認證的開源許可之一。
微軟稱,Oxite是一種具有可拓展性的、標準兼容的內容管理系統,旨在支持博客或更大型的網 站,能支持廣播、引用通告、匿名或驗證評論、個人全球統一標識(Gravatar)頭像及在任何頁面級別輸出RSS Feed等功能。用戶可在某一站點上創建和編輯一整套頁面,并可在頁面中定制HTML代碼,而且還可在單個站點上創建多個博客。
微軟稱,開發Oxite平臺的最初目的就是向開發者展示ASP.Net MVC的功能。
微軟使用Oxite創建了Mix Online網站,并向開發者提供了該站點的源代碼以供學習。Mix Online是一個網絡社區,其中心內容是微軟的Mix網絡開發者會議。
微軟Oxite項目負責人埃里克·波特爾(Erik Porter)稱,Oxite并非現有的、已經確立的博客系統的直接競爭者,也無意挑戰微軟自身的SharePoint工具,后者也帶有內容管理系統的功能。他表示,Oxite平臺目前的對象僅為開發者,但最終可能適用于全體公眾。
埃里克·波特爾(Erik
Porter)在一個Oxite論壇上寫道:“我們對Oxite平臺沒有任何其他計劃,只是希望為開發者提供一個能運行任何站點的范本。也就是說,到目前為止它只是一個社區項目,但如果社區決定要把它帶往其他方向,我們也不會加以阻止。”
二、我為什么選擇Oxite
對于Oxite其實我只是在無聊的時候想找下相關MVC開發的現成項目。所以就進行了一番研究,我覺得這個系統十分適合初學者,如果你覺得不能理解面向對象,可以認真看一下這個Oxite,它充分的現實出面向對象建模的思想,在學校學習的時候我們老師總會用車,人之類的來描述面向對象,而我們在網上看到的大部分代碼,真正用到面向對象思想的其實不多。甚至可以說是教程式的。完全不能體現出面向對象的精髓。Oxite是輕量級的,它并不像petshop那個巨型和復雜。可能你第一打開代碼的時候會被他的類庫項目嚇著。。當你靜下心來的時候。你會發現,這個是一個很好的學習型作品。
三、所需環境
1. Visual Studio 2008 SP1,
2. ASP.Net MVC 1.0
3. xunit-1.5
4. AntiXssLibraryV1.5Installer.msi
5. Enterprise Library 4.1 - October 2008.msi
6. Microsoft SQL Server 2005
7. BlogML 2.zip
以上是我使用的版本,這些版本能讓整個項目跑起來。頁面很簡單,也很簡潔,因為這個項目目前只是一個顯示技術的作用的項目。
四、項目結構
Oxite解決方案由5個項目組成:
1. Oxite; (核心基礎項目)
2. Oxite.LinqToSqlDataProvider;(數據基礎項目依賴于Oxite)
3. Oxite.Mvc;(相當于MVC中的C層,Controllers層的作用,依賴于Oxite)
4. Oxite.Mvc.Tests;(測試層)
5. OxiteSite;(顯示層)
M其實就是1,2,C是3,V是5
相信看到這里大家都可以看到已經基本可以運行期這個系統了。下一章,我將會是解析數據庫
大家第一次接觸編程的時候我想很多人都會在那些Q群啊之類的地方不斷的問,怎么學習編程,要看些那些書。甚至在百度,谷歌里搜索如何學習編程。
這篇文章,我會從我自己學習編程的角度去描述,如何學習,可能不是最好的學習方法,但是我想對于一些朋友總會有幫助的,因為方法是源自你個人。我在這里說一下我的格言:別去想別人怎么做,首先應該想自己怎么做。別去想別人怎么幫助你。首先想自己幫助自己。
想想我自己學習編程也有好多年啦。初三開始小打小鬧的用C語言寫個無聊的printf()到用HTML寫幾個個人網站。雖然沒啥技術含量不過都是自己的勞動,那時候真的很激動,現在回想起來,其實那時候很幼稚。不過也造就了我的興趣吧!好了閑話就少說了,我們入正題。
在學習之前,請允許自己先問下自己:我為什么要做這樣的事。對于編程,我會先問一下,你為什么要學習編程?你會怎么回答?
A:興趣;
B:讀書需要;
C:傳聞是高薪職業;
D:容易就業;
E:被逼的;
F:無聊學學;
這個你會怎么選擇;什么樣的目的,得到什么樣的結果。如果你選擇(A)我會開心,興趣就是動力,就算沒有人教,你也會鼓足勇氣去學習,就我個人來說,我是那種屁股坐不穩的人,你叫我坐在那里什么都不做半個小時,我會全身都不舒服的。但是一說到計算機,編程我可以一坐就是7,8個小時自己還沒感覺。興趣第一,很好,你以這個為目的我相信你一定能學好。相信你也有自己的一套學習方式。
如果你選擇的是B:那么你也有一定的成功幾率,首先你要是一個會讀書的人,可以說讀書就是你的興趣,那么你也可以學好。當然如果只是隨潮流大家都讀所以我也要讀,那么你只能學不好了。
如果你選擇的是C:那么你還是早點放棄吧,那些擁有高薪的都是十分牛的人,其實的廣大程序員還是掙扎在生活的水平線上。混飯吃而已,所以如果你抱著高薪去學習編程,你一定肯痛苦。這類也是最能有成就的一類,編程是技術需要的是一份執著,但是你的執著只是金錢。技術現在并不等于金錢。。。。
如果你選擇的是D:我還是勸你早點放棄,現在的就業也不樂觀啊,失業大軍里計算機就占了很大的一部分比重,你隨時都可能是其中的一分子。
如果你選擇的是E:很好,你也有可能學好,前提是逼你的人能一直強逼你下去,讓你進步,一句非常經典的話:“人都是被逼出來的。。。。。”。你出生的時候的確是被逼出來的,被你媽媽逼出來,呵呵!
如果你選擇的是F:也不錯,起碼你無聊的時候想到的居然是編程,證明編程還能給你帶來樂趣。
既然你已經知道為什么學習編程,那么我們要做的就是怎么去學習了。現在的編程語言很多,上百個語言,但是無論什么語言,都會有共同性的。所以你要學習編程那么就要先學習編程的思想,這個編程的思想你也只能看一下而已。了解一下計算機如何去讀這些編程語言這個很重要。不了解過個你學習任何編程語言都很難做到靈活運用。
你明白了計算機是如何讀編程語言是的這個時候你就可以開始選擇你學習的語言了。至少這些編程語言都是我能看懂的,可以說是自己學過的。也會解析一下學習這些語言的一些特點。
A: c#.NET
B: Java
C: C/C++
D: PHP
E: JavaScript
F: lua
我只列出了五種,其實還有更多的語言,有興趣可以自己去找下這些語言的特色.其實我了出的這些都有一個特色.都是跟C語言有一定的相似的.
A: C#這個語言是微軟推出的,目前大部分應用都是應用在WIN平臺上,雖然LINUX也能用,但支持還不是太好.編程風格上我覺得是最優美.至少看起來很舒適,強大的智能感知.編程的學習難度分級是:初學偏易,一般編程中等,高級編程難。梯度不算陡峭。雖然是面向對象,但是現在大部分的人都很用到面向對象至少我在國內反編譯很多的應用系統的時候很多都沒有用到編程思想的,雖多就是把類用來實現腳本編程閉包功能而已。真正使用到面向對象的繼承多態的并不多。當然也有很多是使用了面向對象思想的,所以我覺得初學C#的時候完全可以放棄對象的繼承,多態這類比較復雜的東西。專心學習他的語法糖,還有封裝好的API,其實C#這個語言已經有個很完善的API基本上的應用都可以直接使用API來實現,而且從算法構造上也不算復雜。再加上IDE的智能感知,新手只需要了解各個命名空間的作用就可以了,智能感知會幫助我們完成API的調用(至少你要知道那些方法在那個空間,怎么用)。所以初學我把它定義在上手“易”。現在的學習其實并非一定要從記事本開始。學會使用IDE學習其實也是一項技能。編程很重要的一點。就是你動了多少手,你就收獲了多少,無論你看了多少別人的代碼,如果你不自己動手去寫一下,你永遠沒辦法感受到內涵,之前我有部分同學,他們跟我說,現在網上大把代碼,那里需要自己敲得那么辛苦干嘛上網COPY一下就什么都有了,傻瓜才自己手寫。好吧我承認我傻瓜。但是自少我現在的水平我敢說,,你只需要給我2樣東西我一樣能寫出你上網找的那些代碼。一樣是VS,另一樣是幫助文檔。說起這個事又令我想起最近公司招聘的一些趣事。最近公司面試了接近80個人吧,因為我們公司的上機考試是不允許上網的。呵呵!你們可以想象一下,不能上網后只有30個能勉強敲的出代碼的。能做出題目的更是少得可憐。突然我就想,這些人到底有沒基礎的,一個簡單的登錄功能和上傳文件功能不能上網就不會寫,我真是狂汗。。。一些號稱三年五年工作經驗的,居然還寫不出一個簡單的交叉表查詢。(其實就10句代碼。。。。)。所以啊過分依靠網絡怎么可能有自己的技術積累呢,這些人在我眼里三年五年也成不了構架師。。可能十年也去不到構架師的水平。
B:JAVA 跟C#類似,傳聞微軟推出C#也是為了對抗JAVA而搞出來的。這兩種語言有很多相似的地方什么是命名的方式上都有很多相似的地方,JAVA也是從C語言里發展起來的。不過我覺得在學習曲線上,初學要比C#難,中國人普遍英語不太好。而且在IDE上微軟的VS要比JAVA的各類編輯器要優勝,主要是在智能感知上,還有一些輔助上。可能很多JAVA的鐵桿FANS會給我丟西瓜,丟雞蛋了。但我敢說,我說的是事實,JAVA位置一個環境都很辛苦,至少我學習的時候是這樣。免費啊,JAVA很多東西都是免費的,微軟要收費的,收費肯定好了。。。。我會偷偷的笑。。。你丫就不用盜版?有了光榮的盜版。收費問題根本就不是問題,再說從學習的角度。。盜版這些東西根本就無關痛癢的。。反而更容易召集人氣。。。
C: C語言可以說是非常牛逼的語言,長期位居第一。但是需要投入的精力也不少啊,智能感知一直進步不大,可能是因為萬惡的宏定義呵呵(這個萬惡可不是我說的。)當然學習C語言如果你不懂使用宏定義那么你肯定沒學過C語言,C語言的宏定義雖然一直在C語言的書本上很少描述但是實際應用卻是不可缺少的,我看過IDSOFT的DOOM的源代碼里簡直就是神一般。但是看起來也真是辛苦。題外話,其實上面很多語言都是根據C語言衍生出來的,什么很多特性都是參照了C語言。用很玄幻的說話。C語言是遠古時代遺留的強大魔法。既然是遠古學習曲線自然就陡峭得可以,我個人感覺我的C語言水平其實都只是菜鳥而已。C++一樣是菜鳥。C++和C其實我覺得是2個語言根本不能混為一談的,但是很多招聘之的都把C/C++歸為一類,所以我也把它歸為一類,很多人想問學C++是不是要先學C。而且C++的分支多得嚇人。內涵也豐富得嚇人。。C語言個人技術化,我個人覺得C/C++起碼要4年才算出師,JAVA是2年,C#都是2年。而且還需要一系列的計算機基礎,算法基礎等一些東西。而JAVA和C#都把這些東西封裝了成標準的API了,我們只需要使用。但是C/C++這些東西都沒有一個確定的標準例如界面庫,有人用QT有人用MFC。這些都是不一樣的所以選擇的路也多,學的東西自然也更多了。但從編程上,并非就是C++的就比用C#的牛。C++只是擁有深厚的歷史,有自己獨特的文明。是因為它的文明而牛。
D:PHP 接觸不深,但是我覺得它是一個制作網頁的好語言,其他領域我并不怎么看好他,我覺得PHP在開發網頁上有很大的優勢,但是開發B/S級系統應用就現得比較力不從心了。所以如果你定位自己作為一個網頁開發人員的話,你就應該學習這種語言。如果是B/S級的應用的話,就應該使用C#或者JAVA,或者其他的語言。
E:JavaScript,非常有名的腳本語言,如果你想從事B/S的開發,網頁開發,你就一定要學這個,是一個必須掌握的技能。學習曲線相對比較平坦,而且內容也不算多,但是應用卻十分靈活的語言。強烈推薦初學者先學習這個語言,來尋找感覺,因為這個語言完全不存在編程環境的問題,你只需要有瀏覽器,記事本,兩樣任何系統都有的軟件就可以編寫它。所以我覺得首先學習它會對你理解編程思想有一定幫助。
F:LUA這個也是一個腳本語言,成就這個語言的名聲是來自一個叫“魔獸世界”的游戲,目前我了解LUA應用的領域比較多都是作為一種嵌入語言,嵌入到C或者C++中去使用,在國內很多游戲公司都會有LUA程序員,部分會由C語言程序員去兼任。因為LUA在語法上和C有很相似的地方,基本對舊的C語言程序員學習LUA是無難度的。當然也有它的局限性,作為腳本語言它本身就存在不足,而且這個語言本身就是作為C語言的擴展來用的所以,學習這個語言的話,建議先學習C語言。或者成就更高(或者而已!)
我個人是選擇C#作為長期發展的語言的。我覺得這個語言比較適合我這種英語不算好,但是又喜歡編程的人。
PS:真心想學編程的必須要學習一定的英語能力,因為很多編程的先進思想都是英文的。所以英語好,對成為高手起很大作用的。
知道為什么學習編程,又選擇了目標語言,接下來就是基礎學習了。
這個基礎學習,我覺得首先要對一些語法糖熟悉,第二件事情就是要多編,多看,可能你買的書都附帶著實例代碼的,我覺得對于初學者,首先你把書上的程序都照著編一次,在這期間,你一定會遇到無數的錯誤,但是這些錯誤將會是重復出現的,這個時候你就學會了如何排錯,有人說過編程不是一口氣寫出來的,是修改出來的。所以學習排錯是編程的第一步,雖然隨書光盤有很多代碼,但是這些代碼都不屬于你的。沒有入你腦,唯一讓這些代碼屬于你的辦法就是多抄(打)幾次。當你把一本編程的基礎書都看透了。。至少別人問你這本書的知識你能答得上口,那就是你度過了第一時期了。你可以進入一搬階段了。
一般的階段,這個階段我把它定義為是把這些語法組織成句子,組織成文章的時期。我想問下,大家都上過語文課吧,我們來回想一下,我們學習語文的過程
字=》詞=》句=》文章;
而編程的學習則是這樣的;
變量=》函數=》類=》架構
所以我們在初學階段做的都是學那些字,那些詞(其實就是語法糖)然后我們就會學造句,造句的時候就會涉及到把什么詞語組合起來會得到優美的句子,而合理的句子,加上合理的邏輯就會變成一篇優美的文章。但是一篇優美的文章并非那么簡單的。也就是一個程序架構的優美一樣沒那么簡單一樣,需要很多很多學識。
using?System;
class?A

{
????public?A()
????
{
????????test();
????}
????public?virtual?void?test()
{}
}
class?B:A

{
????int?x=1;
????int?y;
????public?B()
????
{
????????y=-1;
????}
????public?override?void?test()
????
{
????????Console.WriteLine("x={0},y={1}",x,y);
????}
????static?void?Main(string[]?args)
????
{
????????B?b=new?B();
????}
}
Console.WriteLine("x={0},y={1}",x,y);
7.?某一密碼僅使用K、L、M、N、O共5個字母,密碼中的單詞從左向右排列,密碼單詞必須遵循如下規則:
(1)?密碼單詞的最小長度是兩個字母,可以相同,也可以不同
(2)?K不可能是單詞的第一個字母
(3)?如果L出現,則出現次數不止一次
(4)?M不能使最后一個也不能是倒數第二個字母
(5)?K出現,則N就一定出現
(6)?O如果是最后一個字母,則L一定出現
問題一:下列哪一個字母可以放在LO中的O后面,形成一個3個字母的密碼單詞?
A)?K?B)L?C)?M?D)?N
問題二:如果能得到的字母是K、L、M,那么能夠形成的兩個字母長的密碼單詞的總數是多少?
A)1個?B)3個?C)6個?D)9個
問題三:下列哪一個是單詞密碼?
A)?KLLN?B)?LOML?C)?MLLO?D)NMKO
---------------來自維基百科----------------
jQuery是一款免費且開放源代碼的JavaScript代碼庫,由John?Resig創建。
授權協議為GPL和MIT許可證雙協議。
jQuery?1.3版中,引入全新的CSS選擇器引擎Sizzle。[1]同時不再提供Packed版本,因為解壓縮的消耗的時間,遠大于所節省的下載時間,且不利于Debug,且已有Google?AJAX?Libraries?API等公開站臺提供jQuery的js的引用服務,故Packed版本原本的優點已蕩然無存。
body
{
}{
????font-size:?12px;
????margin:?0px;
????padding:?0px;
????height:?100%;
????????width:?100%;
????overflow:?auto;
????text-align:?center;
????display:?block;
}
/**//*---body我是作為最頂層容器的---所以它具備了我需要的所有東西,實現的效果是居中,我加上了display:?block;雖然這個是一個默認屬性,但是我們不能保證所有瀏覽器都是默認,(如果是所有瀏覽器都默認的,我自己寫個瀏覽器的默認為none的給你耍)*/
#body_Div
{
}{
????margin:?0px?auto;
????padding:?0px;
????text-align:?left;
????width:?1003px;
????height:100%;
????overflow:auto;
}
/**//*這個是核心層,多有的元素基本都是在這個層里的,這個層也具備了我想要的屬性,text-align:?left;?因為在上層我把文本對齊成為居中,所以這個層我要把它還原為左對齊margin:?0px?auto;?一般IE的CSS編寫者不會有這個auto值的,在IE會自動,但是在FF如果少了auto你將會發現FF里你的核心部分不是居中的。所以要做到通用,我們就必須要加上auto值,IE也支持auto值*/
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
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
public?class?CC

{
????private?int?a;
????public?CC()
????
{
???????a=0;
????}
????public?int?newCounter()
????
{
???????this.a=this.a+1;
???????retrun?this.a;
????}
}
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到另外一個函數并不是傳統的函數調用