質問: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' # ROT13 p str.tr('A-Za-z', 'N-ZA-Mn-za-m') p str.tr('\x41-\x5a\x61-\x7a', '\x4e-\x5a\x41-\x4d\x6e-\x7a\x61-\x6d') ```
回答: シングルクォートの中ではバックスラッシュ記法が使えないため、`\`が`\`という文字そのものとして解釈されます。 そうすると`String#tr`は、`\x4e-\x5a`と`\x6e-\x7a`の`e-\`の部分を`e`から`\`までの範囲として解釈しますが、`\`のコードポイントが`e`より小さいため、不正な範囲としてエラーになります。 ドキュメントには明確に書かれていませんが、`String#tr`の範囲指定では右辺のコードポイントが左辺のコードポイント以上でなければいけないという制約があるようです。 (a-zはOKだがz-aという逆順の指定はNG) > > 文字列はダブルクォートまたはシングルクォートで囲まれています。ダブルクォートで囲まれた文字列ではバックスラッシュ記法と式展開(後述)が有効になります。 シングルクォートで囲まれた文字列では、 \(バックスラッシュそのもの)と \' (シングルクォート) を除いて文字列の中身の解釈は行われません。 > > >