標籤:

Ruby - 紅寶石奧義

如Pragmatic的Dave Thomas,這世上有一大票Rubyist。Ruby吸引這麼多開發者的魔力在哪裡?我自己的感覺是語法美妙,有點兒「以貌取語言」了,確實一開始就這樣中招的。接觸Ruby若干年後再接觸Scala時,依舊是這種感覺。

要接納一門語言,就應該融入這個語言的社區,用這個語言特有的方式去開發、去跟社區無縫交互。閱讀這篇圖靈社區的「Dave Thomas:一個開發者的為與不為(圖靈訪談)」,有助於你了解一個Rubyist的態度。

圖靈教育的這本《Ruby基礎教程(第4版)》出版了。原先是說4月份出版,好事多磨,到了九月金秋時節才出來,也讓我等得有點不耐煩了。對於這本書,其實我只想說一句:最佳Ruby入門書籍,而且是標準教材的高度,無出其右。看看Ruby之父Matz的評價就懂了:

本書是最早使用 Ruby 的先驅者們為了歡迎下一批社區成員而寫的一本入門書。本書前 3 個版本幫助過無數新人融入到 Ruby 社區。這次,對應 nRuby 最新版的第 4 版比以往更詳 細,更通俗易懂,對大家學習 Ruby 會有很大的幫助。通過學習本書,衷心希望大家體會到 Ruby n編程帶來的樂趣。

與其說讚美本書,不如說同時也是讚美Ruby,正是有Ruby這個美妙的語言,才有包括本書在內的各種Ruby好書可言。這本書的價值在哪裡?在你對Ruby的喜愛之中,在Rubyist的為人處事之道中。

o(∩_∩)o 哈哈,來玩點Ruby!

借著《浴缸里的驚嘆:256道讓你恍然大悟的趣題》裡面的、適合在浴缸里想的一道忽悠題:

三位客人到了一家旅館,老闆說房費一共30元,所以每人交了10元錢。客人入住後,老闆突然發現其實房費應該是25元,於是讓服務員把5元錢給客人送回n去。服務員心想,這5元錢三個人沒法分啊,於是自己私藏了2元,只退給三位客人每人1元。好了,每位客人實際上只交了9元錢,三位客人一共交了27元,再n加上服務員那兒的2元錢,一共就是27+2=29元。等等,原本不是30元嗎?少的那1元錢哪兒去了?

就讓Ruby來小試牛刀做個論證吧。

account.rb

# encoding: utf-8nn# 每個人錢袋子里的收支情況,初始化都從零開始。nwallet = {:boniface => 0, :guest1 => 0, :guest2 => 0, :guest3 => 0, :staff => 0}nn# processing_step:處理步驟n# wallet :錢包n# m :金額數組n# step :處理步驟標識ndef processing_step(wallet, m, step)n case stepn when 1 # 第一步,老闆說房費一共30元,所以每人交了10元錢。n wallet.each do |key, value|n if key.match(/^guest/)n wallet[key] += -m[0]n wallet[:boniface] += m[0]n endn endn when 2 # 第二步,老闆發現房費是25,讓服務員給客人送回5元。服務員自己藏了2,退給每位客人1。n wallet.each do |key, value|n if key.match(/^guest/)n wallet[key] += m[0]n wallet[:boniface] += -m[0]n endn if key.match(/^staff/)n wallet[key] += m[1]n wallet[:boniface] += -m[1]n endn endn when 3 # 根據前一步驟結果,求證是否真是少了1元?負數的為客人支出,正數為店家及店小二收入。n wallet.each do |key, value|n if value >= 0n m[0] += valuen elsen m[1] += valuen endn endn elsen endnendnn# 數組為每位客人支出10。nprocessing_step(wallet, [10], 1)nputs "第一步驟結束,收支明細:" + wallet.to_snn# 數組為還給每位客人1,店小二自得2。nprocessing_step(wallet, [1, 2], 2)nputs "n第二步驟結束,收支明細:" + wallet.to_snn# 第一個數組值為店家和店小二收入,第二個數組值為客人支出。naccount = [0, 0]nprocessing_step(wallet, account, 3)nputs "n店家及店小二收入:" + account[0].to_snputs "三位客人支出(負值表示):" + account[1].to_sn

結果:

第一步驟結束,收支明細:{:boniface=>30, :guest1=>-10, :guest2=>-10, :guest3=>-10, :staff=>0}nn第二步驟結束,收支明細:{:boniface=>25, :guest1=>-9, :guest2=>-9, :guest3=>-9, :staff=>2}nn店家及店小二收入:27n三位客人支出(負值表示):-27n[Finished in 0.3s]n

收支都是27元,收支平衡。29也罷、30也罷,都是忽悠人的啊。

特讚譽Ruby及本書。

推薦閱讀:

2015 年的今天,Ruby on Rails 還有哪些獨特的價值?
使用Ruby實現七牛同步盤(一)
Ruby基礎語法
可否有大神幫助解析NotoColorEmoji.ttf?
使用 jeykll 或 octopress 在 GitHub 上架 Blog 的工作原理是怎樣的?

TAG:Ruby |