Martin演講實錄2:現場演示Ruby編程

發表于:2007-06-11來源:作者:點擊數: 標簽:
現場演示Ruby編程 我們現場有多少人使用過 ruby 進行 開發 ?很驚訝,只是個別人。所以很多人還沒有見過ruby,這就是我帶筆記本來的原因了。我將演示一下我們究竟能用ruby做什么。這樣的話,我們將會對這個語言有一個認識。 我現在把話筒放在一邊,放好我的筆

現場演示Ruby編程

我們現場有多少人使用過ruby進行開發?很驚訝,只是個別人。所以很多人還沒有見過ruby,這就是我帶筆記本來的原因了。我將演示一下我們究竟能用ruby做什么。這樣的話,我們將會對這個語言有一個認識。

我現在把話筒放在一邊,放好我的筆記本電腦。

Ruby是一種立即執行的腳本語言。接下來在編輯器環境中新建一個源代碼文件。這個控制臺的窗口不會被經常用到,不用擔心,我可以鍵入這個文件的名稱,然后運行它。我同樣可以在編輯器里做這件事情,把它打印在其他的文件里面。我們現在要做一個小程序。這里是一些數據圖表,把它想象成是每個國家的圖表,包括:失敗圖表(fails figures),執行圖表(operating figures)等等。這些可能是業務人員每天要關注的事情?,F在我們把第一項想象成地區,第二項想象成預期的銷售額,第三項,想象成實際情況。那么現在這些業務人員提出了一個要求,讓我打印出這些數據,并且顯示出預期值與真實值之間差別的百分比。所以我們需要花一些時間完成這個工作。

我們要做的第一項工作是讀出這個文件,并且把它顯示出來。我在一開始會比較慢的展示應該怎樣做。(輸入代碼)這會是一個比較簡單的版本。它現在能夠把文件的內容顯示出來了。我下面來解釋一個這里的語法。這里有一個File類,有個方法是open。在這里并沒有在參數外面加上括號,不過如果需要的話可以在這里加上,程序依然能工作。括號在ruby編程中是可以選擇的,這看起來不是一個很重要的語法點,但是很多時候,這是非常重要的,比如在接下來的編碼中,或者是其他的一些腳本。之后這里有一個非常簡單的while循環。我們結束一個局部變量line,通過getline得到這個變量。記住,只有在需要的時候才去聲明這個變量,我們不預先聲明。之后我們輸出這一行,然后關閉文件。

但是,我已經說了,這不是用ruby實現這個功能的方式。通常,你會這樣做。這里出了一個錯誤。Ruby有一個非常好的幫助系統。我們在這里察看一下錯誤究竟出在哪里。我確實記不起來了。不過可以看一看以前寫過的。這樣的編程是非常危險的,因為你需要知道你在做什么,同時要把你正在做的東西表達出來。

這是非常難的,我很少這樣做。所以這里,我正在做的這個事情,就這個語言來說是非常老練的(sophisticated)。這里對于文件的每一行進行了操作。這一部分是文件的closure。這里是說,在do和end之間執行這一段非常短的代碼。在每次執行命令的時候,都執行一次。把一段代碼作為參數傳入一個function,這在編程語言中是非常常見的。在smalltalk中是如此,那么在java中的也是,匿名方法(anonymous method)。C#中的代理從根本上來說也是這個道理。closure是ruby的一個特點非常強大的特點。如果你經常使用ruby的話,你會發現,這種closure有非常非常多的應用。在這里使用這種方式的好處是,它可以對你傳入文件名的每一個文件的每一行執行這個操作,在執行完之后會關閉文件。如果不用這種方法,你必須要每次執行完操作就關閉文件,這就形成了一系列的事務,在做完一件事情的時候要去做下一件。使用這種匿名方法的方式就可以避免這個問題。

接下來要做的事情是,把這一行輸出放入一個對象里。在這里建立一個類,名字是performance?,F在給這個類建立我們需要的figure, 名字是attr_assessor, 然后定義name amount和actual, 這里實際上定義了我們需要顯示的三個值。這里我就可以對我的循環里的代碼進行改變了。

P = performance.new

p.name = line.split(‘,’)[0] 這里行可以用逗號分隔,然后我們得到其中的第一個。之后我們輸出p,這里我們看到輸出的是p這個對象本身,而不是我們希望的值。在java中,我們可以定義一個字符串類型。但是在ruby里面,我們定義一個def to_s函數, 使它返回name的值?,F在,我們在輸出結果里面,就看到我們真正想要的name了。所以,我們可以看到,建立一個我們需要的類是非常容易的。接下來,我們可以把這個類改為真正的面向對象風格。我們需要結果返回一個數組。Read方法的是返回result這個數組。(進行了一系列代碼的動作,調試,忘記把p加入到result數組中了)這樣就得到了正確的結果。我們有一些值需要放入我們的這個類里。通過這樣做,我們就可以實現了。這里line.split(‘,’)會返回一個數組。這一句代碼執行了復合的操作。每一個變量,對應到數組中的不同的值。這是腳本語言的一個特點。所以,在返回字符串的函數里加上plan,加上actual,再次查看結果,我們就可以看到我們想得到的所有值了。

現在來看我們的代碼是很有條理的。那么我們可以加入計算的功能了。定義一個variance方法。返回(actual -plan)/plan * 100,這樣我們就得到了百分比。(寫了一系列代碼)這時候我可以確定代碼是不能運行的,因為現在這些值都還是字符類型(寫了一系列代碼)。所有的腳本語言都有一個共同的問題:沒有異常機制的。但是可以通過其他方式處理錯誤?,F在來看一看結果,我得到了極限值。這里是因為我忘了加入浮點。這樣的話結果就是正確的了。不過,我們得到的輸出是很難看的。我們即將使用Ruby的格式化字符串的機制。(寫了一些代碼使輸出變為小數點后一位。)接下來輸出國家名,這樣我們就可以看到完整的顯示了。在格式化字符串輸出的這段代碼里面,就像C語言里面一樣,可以對輸出進行格式化。

現在程序還是有一些問題,不過我們要繼續看下一部分了。在perfs加入排序。這里通過variance進行排序。(寫了一些代碼)現在顯示的結果是按照variance進行排序的了。我們需要知道的最重要的是這一行代碼。這是ruby中closure的使用。我把數組放在raw_perfs里,它按照特殊的域進行了排序,然后對他進行了另一個操作。在集合上進行了操作的疊加。在ruby里,對collection的這種操作,使ruby成為一個非常簡潔的語言。無論是對smalltalk還是對list,對對象這樣的操作都是相似的。但是,當你還沒有使用這種語言的時候,它看起來并不普遍。但是你一旦開始利用這種特性,它將會變得非常強大,因為你可以方便的使用你的meta進行操作。

(責任編輯 火鳳凰 sunsj@51cto.com  TEL:(010)68476636-8007)





原文轉自:http://www.anti-gravitydesign.com

...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97