由於工作關係,一直沒有時間學習ruby,最近終於有時間可以學習下ruby了,同時也在csdn開了blog,藉此記錄一下自己學習的心得,當然不僅僅是ruby,近幾年動態語言非常的火熱,而我個人也非常喜歡動態語言的簡潔,可惜一直都沒什麼時間花在上面,如果可能除了ruby,我也想花花時間在其他的語言上,例如Groovy,不過暫時還是以ruby為主,其他的有時間再看了。
對於ruby來說,我完全是個新手,所以目前所寫的文章都絕對是基礎性的,主要作為一個筆記的作用,所以各位高手可不要BS在下。不過還好,總是有一點點底子,學起來不至於那麼痛苦。昨天搞了本《The Ruby way》來看,本來想買《Programming Ruby》,可是後來看到Way這本書覺得它更適合我,對於一般的文法介紹隨便上網看看就可以了,而Way一書主要是從解決各種問題著手,實用性較強,我們學語言就是為瞭解決問題嘛,可不是為了顯擺,經過艱難的抉擇最終選擇了Way這本書(最主要是way一書便宜些,呵呵),有的朋友說這些書可以從網路上獲得,為什麼還要買?我只能說這是我的習慣,更喜歡實體書,特別是好書自己一定要有一本實體書收藏。(汗一個,只是為了收藏。)
買了書回來後,迫不及待的翻開看了下,其中第一章有一段粗略的講了下迭代器的實現,大概看了下,實現非常簡單,其代碼如下:
def repeat(condition)
yield
retry if not condition
end
repeat方法接受一個condition參數,首先運行代碼塊,然後如果condition為false的時候retry進行重新運行代碼塊。非常簡單且簡潔的實現,這裡包含了兩個重要的關鍵字,一個是yield,另外一個就是retry,yield的作用就是執行方法所接受的代碼塊,這是動態語言中非常重要的概念,如果對這個概念不瞭解,那麼ruby就很難學下去了,在Groovy裡面也有同樣的功能,使用Closure閉包實現的。而retry的作用就是重新運行代碼塊,當然是在not condition成立的時候。
書裡同時也實現了一個可傳遞參數的迭代器實現,代碼如下(為什麼csdn插入代碼功能裡提供的語言種類沒有ruby,鬱悶):def my_sequence
for i in 1..10 do
yield i
end
end
my_sequence {|x| puts x**3 }
以上代碼實現了一個迭代器產生1~10的整數,然後調用這個迭代器產生前10個整數的立方。方法接受一個帶參數的代碼塊{|x| puts x**3 },然後進行迴圈運行該代碼塊,yield之後的i就是傳給代碼塊的參數。
對於以上第一個實現,我對其進行了一點點修改,具體如下:def repeat(condition)
if not condition
yield
retry
end
end
說實話,這個實現我也是按照自己的理解修改,感覺這樣更適合,自己試了下沒什麼問題,結果也如我所料,可是感覺這樣的寫法不太好,只能在慢慢的學習去體會了。