Rubyの便利メソッド Kernel#Array
Kernel#Arrayは引数で受け取ったものを配列に変換してくれるメソッドなのですが、 意外に便利です。 引数で受け取ったいろいろなオブジェクトを配列にして返却してくれます。
module function Kernel.#Array (Ruby 2.2.0)
試してみると
Array(nil) #=> [] Array("fefe") #=> ["fefe"] Array(11) #=> [11] Array([1,2,3]) #=> [1, 2, 3] Array({key: :value, key2: :value2}) #=> [[:key, :value], [:key2, :value2]] Array(1..10) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
rdocでは
Returns arg as an Array.
First tries to call to_ary on arg, then to_a.
arg に to_ary, to_a のいずれのメソッドも定義されていない場合は 一要素の配列 [arg] を返します
となっているので
メソッドの中身は以下のようなものになってるはず。(推測)
object.respond_to?(:to_ary) ? object.to_ary : object.to_a
RailsのActiveSupportでもArray#wrapがあり
似たようにArrayを返却してくれるメソッドがあり、こちらは
Array.wrap(nil) #=> [] Array.wrap("fefe") #=> ["fefe"] Array.wrap(11) #=> [11] Array.wrap([1,2,3]) #=> [1, 2, 3] Array.wrap({key: :value, key2: :value2}) #=> [{:key=>:value, :key2=>:value2}] Array.wrap(1..10) #=> [1..10]
返却される内容はKernel#Arrayとはすこし違っています。
ちなみにwrapの中身は
def self.wrap(object) if object.nil? [] elsif object.respond_to?(:to_ary) object.to_ary || [object] else [object] end end
となっています。
RangeやHashが引数に設定されていた場合の挙動が違っているので注意が必要ですが、
使い方に応じて呼び出すと処理がスッキリして使い勝手がいいですね。