zdogma's diary

徒然なるエンジニアな日々。

gsub! sub! でパターンにマッチしなかった場合 nil が返る

ことはじめ

AtomPub で引っ張ってきたブログテキストに手を加えて別のアプリケーションで表示させようとしていた時に、表題の件でややハマりました。
ハマり時間は数分だったものの、割と想定外な内容だったので備忘も兼ねてメモしておきます。

本題

パターンにヒットする場合

[1] pry(main)> "abc".gsub(/a/, "")
"bc"
[2] pry(main)> "abc".gsub!(/a/, "")
"bc"

いずれもレシーバ自身に対して置換を行った処理後の文字列を返しています。
これは想定通り。

パターンにヒットしない場合

[3] pry(main)> "abc".gsub(/d/, "")
"abc"
[4] pry(main)> "abc".gsub!(/d/, "")
nil

gsub! もレシーバ自身を返してくれるかと思いきや、ここは nil が返ります。
AtomPub から返却されるのが本文全体の String なので、特定のタグがあったら変換、などをしていたのですが、 たまたまそのタグが使われていない記事があって、すっからかんになってしまい焦りました。

おわりに

ドキュメントを読めば書いてあるので、ちゃんと読んどけよ、という話ではあるのですが、 他の select, select! とかの関係性からの推測で判断すると結構ハマるような...。
組み込みの関数とかで勘違いして前提を見誤ると、テストの漏れ等にもつながってしまうので、 ちゃんとドキュメントを読んでコードを書きましょう、ということですね。

参考ドキュメント

ref.xaio.jp ref.xaio.jp