【Ruby】配列または文字列どちらも受け取れる関数を作りたい
状況
成り行きで関数に文字列と配列の両方が入ってくるコードができあがった。配列が来たらeach
で回して要素を処理すればOK、と思っていたら引数が文字列の場合にエラーが出た。両方対応できるようにしたい。
解決
instance_of?(Array)
を使って配列を判定する。引数が配列のときにtrue
を返す。
コード
引数を受けて配列なら要素べつに処理、文字列ならそいつ自身を処理して配列を返す関数にできる。
def do_stuff(chunk) ret = [] if chunk.instance_of?(Array) chunk.each do |element| # do something ret << hogehoge(element) end else ret = fugafuga(chunk) end return ret.present? ? ret.flatten.compact.uniq : [] end
雑感
こういう処理は、有名なモジュールのソースコードをみればうまい書き方が学べる気がする。「こういうときはこう」というベストプラクティス的な書き方は知っておくと役に立つ。
あと、配列変数を宣言したあとでarry << ['hoge', 'fuga']
とすると、
[['hoge', 'fuga']]
みたいに配列がネストするのでフラットにしてから返している。なんだけど、もっとうまいやり方ありそう。