読者です 読者をやめる 読者になる 読者になる

hotoolong's blog

Railsやvimや気になったことを綴ってます

Rubyの便利メソッド Kernel#Array

ruby2.2 ruby

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

RailsActiveSupportでも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が引数に設定されていた場合の挙動が違っているので注意が必要ですが、

使い方に応じて呼び出すと処理がスッキリして使い勝手がいいですね。