Ruby

Kernel.#Array で型の差異を吸収する

More than 3 years have passed since last update.


概要

引数が配列でもそうでなくても動くようなメソッドを定義したいときってありますよね。

そんなとき if 文 や case 文を使って引数を加工していませんか?

Kernel.#Array を使うともっと便利になります!


使用例

しんどいコード

(本当は Range のままでも Enumerable#inject は使えますが説明のために入れています。)

def sum(numbers)

numbers =
case numbers
when Array
numbers
when Fixnum
[numbers]
when Range
numbers.to_a
end

numbers.inject(:+)
end

sum(15) #=> 15
sum([1,2,3,4,5]) #=> 15
sum(1..5) #=> 15

幸せなコード

def sum(numbers)

Array(numbers).inject(:+)
end

sum(15) #=> 15
sum([1,2,3,4,5]) #=> 15
sum(1..5) #=> 15


参考

module function Kernel.#Array


arg に to_ary, to_a のいずれのメソッドも定義されていない場合は 一要素の配列 [arg] を返します。


ここがポイントですね。