例えば、岸辺 露伴
という名前の文字列を渡されて、これを姓名に分割するとします。
この文字列は ルール として、姓名の間に全角スペースが入るものとします。
何も考えずにやると、
name = '岸辺 露伴'
last, first = name.split(' ')[0], name.split(' ')[1]
=> ["岸辺", "露伴"]
とかやっちゃいます。
でもこのルールが守られていない汚れデータが入ってくると、
name = 'ファニー・バレンタイン'
last, first = name.split(' ')[0], name.split(' ')[1]
=> ["ファニー・バレンタイン", nil]
nilっちゃったよ。
まぁ汚れたデータのほうが悪いんですが、こういうパターンも安全に倒したいなと思ったので、以下のようにしました。
class String
def split_get(pattern, index, limit = -1)
self.split(pattern, limit)[index].presence || ''
end
end
presence
を使わないなら
class String
def split_get(pattern, index, limit = -1)
str = self.split(pattern, limit)[index]
str.nil? ? '' : str
end
end
これなら
name = 'ファニー・バレンタイン'
last, first = name.split_get(' ', 0), name.split_get(' ', 1)
=> ["ファニー・バレンタイン", ""]
nilじゃなく空文字で帰ってくるので、NoMethodError
とかならない。
瑣末なことだけど、こういうオプションもあったほうが便利だよね、ということで。。
追記
コメントでArray#fetchを教えてもらいました。
やっぱり車輪は作る前から存在しているもんだね