2008年4月27日 星期日

Ruby初試心得

最近沒事開始玩一些東西,其中一樣就是ACM,一種練習寫程式的好地方,裡面有上萬筆題目可以讓人來打發時間。其中第124題,看了之後覺得可以動手於是開始想要用哪種語言來寫。用C語言的話,我對其字串處理不熟,所以不知道該如何下手好;如果用JAVA應該還不錯,最近也看了一些軟體工程的書,說不定可以派上用場,也許可以用一些高階的資料結構來解這題。不過當我真的要開始下手的時候,遇到了一個我忘記的嚴重問題,我已經忘了java要如何從鍵盤(標準input裝置)去得到輸入的字串。只記得是用串流...然後就忘記了,結果是冏在哪邊。接下來我想VB也是可以OO,字串處理我也OK,標準輸入輸出也很簡單,只是剛開始要我碰真的有很多困難點,很多同義的語法,但是要用一些很奇怪的表示法,讓人難以適應。不過這都還算是小事,最讓我頭痛的是互相參考的類別編譯不能過...阿~~我承認在設計上是有這樣的瑕疵,但是不給過也太過份了,所以就跳槽到最近才開始碰的ruby。

Ruby是全OO的語言,我想應該沒啥問題吧...不過還是有很多問題XXD。一開始遇到的是Ruby沒有介面(Interface)!!很好...這樣設計模式第一條,針對介面而寫程式我就冏了。沒關係,那我就想像有一個介面在那邊,程式碼一樣寫,只不過是少了一個實作介面的步驟。在初步構想下,我是先將題目的概念轉化成一種節點與節點之間的關係,第一行輸入會讓程式將所有元素宣告成一種基礎節點(basenode),然後再經由第二條的條件式,去真的new出節點。而在這裡會產生的實例(Instance)會有兩種:一種是跟順序無關的節點(freenode);一種是被條件限制住的節點(limitnode)。經由程式去判讀條件式,並分別將基礎節點實際產生出節點實例。

基於上述想法,我就開始寫了下述錯誤的程式碼(邏輯上的錯誤)。不過讓我有fu的其實是其中雜湊所帶來的震撼,雜湊很有趣,很方便,可以給程式碼帶來更多的便利性以及高度的抽象化。但是當我正爽的時候,卻發現我要用for each取出其中的元素的時候,資料型態居然不是我當初所放進去的freenode/limitnode,而是array,使得下面的程式碼完全沒辦法跑,因為會有找不到方法的錯誤(因為is_bigger是節點的方法,而array本身沒有),最後才發現原來是雜湊在被call for each的時候會像是先利用call to_a轉換成陣列型態之後再被丟出裡面的元素,而其元素則是包含鍵與其值,也就是[key, value],所以丟出來的東西是array沒錯...當然沒辦法取得我所定義的方法。

我這邊的解法很簡單,取出第二個值就結束了XXD。不過剛剛看了一下hash的方法,應該還有其他的方法可以解,等等試試看^^~這邊就放錯誤的程式碼上來,以便可以觀察錯誤的地方。
以知有錯的地方有:is_bigger的邏輯(含limitnode的實作)、判斷free/limit node的程式區段
錯誤的程式碼

沒有留言: