兩個 Ruby 建構 Array 和 Hash 的小技巧

Array

我想你可能寫過以下這樣的程式。其中 params[:a] 可以只有一個元素,也可以是陣列。但是為了接下來能夠處理,我們需要轉成陣列 array 變數:


array = (params[:a].is_a? Array)? params[:a] : [params[:a]]

這裡我們手動判斷了 params[:a] 是不是陣列,實在是有點 ugly。其實 Ruby 內建的 API 就可以支援下述寫法:


array = Array(params[:a])

無論 params[:a] 是陣列還是單一元素,Array(params[:a])會確保出來一定是陣列。

Hash

你有一個物件或是陣列,你想要轉成 Hash,最常見基本的作法會是先初始一個 hash,然後迭代設定它:


hash = {}
data.each { |d| hash[d.foo] =  d.bar }

高級一點的,也許會思考怎樣寫成一行,然後想到用 inject:


hash = data.inject({}) { |h,d| h[d.foo] =  d.bar; h }

不過,這裡我要介紹一種我的最愛:


hash = Hash[ data.map {|d| [d.foo, d.bar]} ]

Hash[]是一個Ruby內建的API可以把陣列轉成Hash,而且效能非常好,比前兩個方法都好。inject想當然是最慢的,我最不推薦使用。

有人跟我抱怨Hash[]有點 magic 可讀性不佳。可是啊,這是 Ruby “原生”的 Hash API,一點都不 magic。你不知道看不懂跟抱怨程式碼可讀性不佳,我個人認為是兩件事情哩。

你可能感兴趣的:(Ruby)