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! とかの関係性からの推測で判断すると結構ハマるような...。
組み込みの関数とかで勘違いして前提を見誤ると、テストの漏れ等にもつながってしまうので、
ちゃんとドキュメントを読んでコードを書きましょう、ということですね。