网站大量收购独家精品文档,联系QQ:2885784924

ruby 函数式程式设计.pdf

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ruby 函数式程式设计

Ruby 函數式程式設計 by Arnau Sanchez 本文件翻譯自 Arnau Sanchez (tokland)所編譯的這份文件 RubyFunctionalProgramming。 同時也有日文版本。 目錄  簡介  理論部分  Ruby 的函數式程式設計 o 不要更新變數 o 不要重用變量  用 Blocks 作為高階函數  物件導向與函數式程式設計  萬物皆表達式  遞迴  惰性枚舉器  一個實際的範例  結論  簡報  延伸閱讀 簡介 命令式程式設計比較威嗎? 不!不!不!只是比較快,比較簡單,比較誘人而 已。 x = x + 1 在以前上小學的美好回憶裡,我們可能都曾對上面這個式子感到困惑。這個 x 到底是什麼呢?為什麼加了一之後,x 仍然還是 x。 不知道為什麼,我們就開始寫程式了,也就不在乎這是為什麼了。心想: “嗯”, “這不是什麼大問題,程式設計就是事情做完最重要,沒有必要去挑 剔數學的純粹性 (讓大學裡的大鬍子教獸們去煩惱就好)” 。但我們錯了, 也因此付出極高的代價,只因我們不了解它。 理論部分 維基百科的解釋: “函數式程式設計是一種寫程式的範式,將計算視為對數學 函數的求值,並避免使用狀態及可變的資料” 換句話說,函數式程式設計提倡 沒有副作用的程式,不改變變數的值。這與命令式程式設計相反,命令式程式 設計強調改變狀態。 令人驚訝的是,函數式程式設計就這樣而已。那…有什麼好處呢?  更簡潔的程式碼: “變數”一旦定義之後就不再改動,所以我們不需要 追蹤變數的狀態,就可以理解一個函數、方法、類別、甚至是整個專案 是怎麼工作的。  參照透明:表達式可以用本身的值換掉。如果我們用同樣的參數呼叫一 個函數,我們確信輸出會是一樣的結果(沒有其它的狀態可改變它的 值)。這也是為什麼愛因斯坦說: “重複做一樣的事卻期望不同的結 果”是瘋狂的理由。 參照透明打開了前往某些美妙事物的大門  平行化:如果呼叫函數是各自獨立的,則他們可以在不同的進程甚至是 機器裡執行,而不會有競態條件的問題。 “平常” 寫 Concurrency 程 式討厭的細節(鎖、semaphore…等)在函數式程式設計裡面通通消失不 見了。  記憶化:由於函數呼叫的結果等於它的回傳值,我們可以把這些值快取 起來。  模組化:程式碼裡不存有狀態,所以我們可以將專案用小的黑箱連結起 來,函數式程式設計提倡自底向上的程式設計風格。  容易除錯:函數彼此互相隔離,只依賴輸入與輸出,所以很容易除錯。 Ruby 的函數式程式設計 一切都是這麼美好,但怎樣才能將函數式程式設計,應用到每天寫 Ruby (Ruby 不是個函數式語言)的程式開發裡呢?函數式程式設計廣義來說,是一種風 格,可以用在任何語言。當然啦,用在特別為這種範式打造的語言裡顯得更自 然,但某種程度上來說,可以應用到任何語言。 讓我們先釐清這一點:本文沒有要提倡古怪的風格,比如僅僅為了要延續理論 函數式程式設計的純粹性所帶來的古怪風格。反之,我想說的重點是,我們應 該 當可以提昇程式碼品質時,才使用函數式程式設計 ,不然這只不過是個糟 糕的解決辦法。 不要更新變數 別更新它們,創造新的變數。 不要對陣列或字串做 append No: indexes = [1, 2, 3] indexes 4 indexes # [1, 2, 3, 4] Yes: indexes = [1, 2, 3] all_indexes = indexes + [4] # [1, 2, 3, 4] 不要更新 hash No: hash = {:a = 1, :b = 2} hash [:c] = 3 hash Yes: hash = {:a = 1, :b = 2} new_hash = hash.merge (:c = 3) 不要使用破壞性方法 No: string = hell

文档评论(0)

牛X文档 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档