以 Thinker 舉的例子為例, 「每行有兩個數字, 將它們相乘後, 加總各行的結果」, 試寫 Ruby 的程式如下:
>> $data = ["2 3", "4 5"]
=> ["2 3", "4 5"]
>> $data.map{ |line| line.split }
=> [["2", "3"], ["4", "5"]]
>> $data.map{ |line| line.split }.map{ |xs| xs.map{ |x| x.to_i } }
=> [[2, 3], [4, 5]]
>> $data.map{ |line| line.split }.map{ |xs| xs.map{ |x| x.to_i } }.map{ |x,y| x*y }
=> [6, 20]
>> $data.map{ |line| line.split }.map{ |xs| xs.map{ |x| x.to_i } }.map{ |x,y| x*y }.reduce { |sum,n| sum + n }
=> 26
懶得裝 Ruby/irb 的人可以用 tryruby.org 試試, 上面的程式碼是我在上面寫好後, 排版後貼過來的。習慣這種資料轉換的思維後 (functional programming?), 配合 Ruby 的 code block, 可以一直線地寫到底, 相當痛快。不過是否好讀, 和習慣和個人喜好有觀, 不在此篇的討論範圍。我自己是覺得寫起來很爽, 但不好讀, 少了用變數抽象化前面操作的結果, 得讀完全部細節才知道在做什麼。
2011-04-15 更新
避免沒寫過 Ruby 的人誤會 code block 像是塞成一行程式碼寫爽的功能, 將最後的結果排版了一下:
>> $data = ["2 3", "4 5"]
>> $data.map { |line|
.. line.split
.. }.map { |xs|
.. xs.map { |x|
.. x.to_i
.. }
.. }.map { |x, y|
.. x * y
.. }.reduce { |sum, n|
.. sum + n
.. }
=> 26
實際寫的時候, 常會要在一個 code block 寫個兩三行, 這時就排版拆行寫了。