P学習帳

書いておぼえるブログ

【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']]

みたいに配列がネストするのでフラットにしてから返している。なんだけど、もっとうまいやり方ありそう。