質問: Rubyで文字列末尾からn文字を取り出したいです Ruby の String#slice は、第一引数に「文字列の長さ+1」を超える絶対値を持つ数値を渡すと nil を返却します そのため、安易に `str.slice(-n, -1)` としてしまうと nil が返却されてしまい、nil チェックなしに String のメソッドを利用すると NoMethodError が発生してしまいます (n は必ず正の整数です) Ruby では「文字列の末尾n文字を得る」という至極単純な操作を分岐なしに実現することは本当にできないのでしょうか? `str.slice(-n, -1) || ""` で限界なのでしょうか?
回答: もしかしたら、どなたかがシンプルで使いやすいイディオムを思いつくかもしれないですが、あなたがお書きになった `str.slice(-n, -1) || ""` で十分かと思います。 > > 安易に str.slice(-n, -1) としてしまうと nil が返却されてしまい、nil チェックなしに String のメソッドを利用すると NoMethodError が発生してしまいます > > > とありますが、 に > > slice(start, length) → new_str or nil > > > と、ご存知の通り nil を返す仕様です。 これを nil ではなく空文字を返す仕様にする方法はないかということと同じことだと思います。そういったメソッドは無いので、既存の似たようなメソッド(今回はnilを返す)に空文字を返してくれといっても無理です。 ちなみに`Array`には`fetch`という該当するインデックスが無い場合、デフォルトの値を変わりに取得するメソッドがありますが、この`fetch`は範囲を指定することができないので、似ているがやはり違う用途となります。`fetch`と`slice`を参考にご自身で欲しいメソッドを作ったほうがよいかと考えます。