rurema / doctree

Repository of Japanese Ruby reference manual
https://docs.ruby-lang.org/ja/
242 stars 312 forks source link

String#strip、#strip!、#lstrip、#lstrip!のマニュアルと異なる挙動 #2877

Closed sisshiki1969 closed 2 months ago

sisshiki1969 commented 3 months ago

String#stripですが、日本語マニュアルだと「また、文字列右側からは "\0" も取り除きますが、左側の "\0" は取り除きません。」と記載されています。 が、現在は「左側の "\0" も取り除く」ように実装が変更されています。 コード例も現在の挙動と異なります。(3.0.0以降)

マニュアルの記載

p "  \0  abc  \0".strip  # => "\000  abc"   # 右側のみ "\0" も取り除く

現在の挙動

❯ ruby -v -e 'p "  \0  abc  \0".strip'
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
"abc"

なお、2.7.8以前のバージョンでは現在のマニュアル通りの挙動となるようです。

❯ ruby -v -e 'p "  \0  abc  \0".strip'
ruby 2.7.8p225 (2023-03-30 revision 1f4d455848) [x86_64-linux]
"\u0000  abc"

このコミットでlstrip_offset()の実装が変更されているのが原因と思われます。

この修正に関しては左側の"\0"だけ削らないのはバグであるとしてBug #17467で議論されており、日本語マニュアルの挙動が変更になるので修正が必要という話も出ていますが、そのままになってしまったようです。

String#strip!, #lstrip, lstrip!でも同様の問題があります。