Ruby - 红宝石奥义

Ruby - 红宝石奥义

如Pragmatic的Dave Thomas,这世上有一大票Rubyist。Ruby吸引这么多开发者的魔力在哪里?我自己的感觉是语法美妙,有点儿“以貌取语言”了,确实一开始就这样中招的。接触Ruby若干年后再接触Scala时,依旧是这种感觉。

要接纳一门语言,就应该融入这个语言的社区,用这个语言特有的方式去开发、去跟社区无缝交互。阅读这篇图灵社区的「Dave Thomas:一个开发者的为与不为(图灵访谈)」,有助于你了解一个Rubyist的态度。

图灵教育的这本《Ruby基础教程(第4版)》出版了。原先是说4月份出版,好事多磨,到了九月金秋时节才出来,也让我等得有点不耐烦了。对于这本书,其实我只想说一句:最佳Ruby入门书籍,而且是标准教材的高度,无出其右。看看Ruby之父Matz的评价就懂了:

本书是最早使用 Ruby 的先驱者们为了欢迎下一批社区成员而写的一本入门书。本书前 3 个版本帮助过无数新人融入到 Ruby 社区。这次,对应 Ruby 最新版的第 4 版比以往更详 细,更通俗易懂,对大家学习 Ruby 会有很大的帮助。通过学习本书,衷心希望大家体会到 Ruby 编程带来的乐趣。

与其说赞美本书,不如说同时也是赞美Ruby,正是有Ruby这个美妙的语言,才有包括本书在内的各种Ruby好书可言。这本书的价值在哪里?在你对Ruby的喜爱之中,在Rubyist的为人处事之道中。

o(∩_∩)o 哈哈,来玩点Ruby!

借着《浴缸里的惊叹:256道让你恍然大悟的趣题》里面的、适合在浴缸里想的一道忽悠题:

三位客人到了一家旅馆,老板说房费一共30元,所以每人交了10元钱。客人入住后,老板突然发现其实房费应该是25元,于是让服务员把5元钱给客人送回 去。服务员心想,这5元钱三个人没法分啊,于是自己私藏了2元,只退给三位客人每人1元。好了,每位客人实际上只交了9元钱,三位客人一共交了27元,再 加上服务员那儿的2元钱,一共就是27+2=29元。等等,原本不是30元吗?少的那1元钱哪儿去了?

就让Ruby来小试牛刀做个论证吧。

account.rb

# encoding: utf-8

# 每个人钱袋子里的收支情况,初始化都从零开始。
wallet = {:boniface => 0, :guest1 => 0, :guest2 => 0, :guest3 => 0, :staff => 0}

# processing_step:处理步骤
# wallet         :钱包
# m              :金额数组
# step           :处理步骤标识
def processing_step(wallet, m, step)
    case step
    when 1  # 第一步,老板说房费一共30元,所以每人交了10元钱。
        wallet.each do |key, value|
            if key.match(/^guest/)
                wallet[key] += -m[0]
                wallet[:boniface] += m[0]
            end
        end
    when 2  # 第二步,老板发现房费是25,让服务员给客人送回5元。服务员自己藏了2,退给每位客人1。
        wallet.each do |key, value|
            if key.match(/^guest/)
                wallet[key] += m[0]
                wallet[:boniface] += -m[0]
            end
            if key.match(/^staff/)
                wallet[key] += m[1]
                wallet[:boniface] += -m[1]
            end
        end
    when 3  # 根据前一步骤结果,求证是否真是少了1元?负数的为客人支出,正数为店家及店小二收入。
        wallet.each do |key, value|
            if value >= 0
                m[0] += value
            else
                m[1]  += value
            end
        end
    else
    end
end

# 数组为每位客人支出10。
processing_step(wallet, [10], 1)
puts "第一步骤结束,收支明细:" + wallet.to_s

# 数组为还给每位客人1,店小二自得2。
processing_step(wallet, [1, 2], 2)
puts "\n第二步骤结束,收支明细:" + wallet.to_s

# 第一个数组值为店家和店小二收入,第二个数组值为客人支出。
account = [0, 0]
processing_step(wallet, account, 3)
puts "\n店家及店小二收入:" + account[0].to_s
puts "三位客人支出(负值表示):" + account[1].to_s

结果:

第一步骤结束,收支明细:{:boniface=>30, :guest1=>-10, :guest2=>-10, :guest3=>-10, :staff=>0}

第二步骤结束,收支明细:{:boniface=>25, :guest1=>-9, :guest2=>-9, :guest3=>-9, :staff=>2}

店家及店小二收入:27
三位客人支出(负值表示):-27
[Finished in 0.3s]

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

特赞誉Ruby及本书。

编辑于 2014-09-13

文章被以下专栏收录