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。你不知道看不懂跟抱怨程式碼可讀性不佳,我個人認為是兩件事情哩。