はじめに
Ruby技術者認定試験Goldの対策時に存在を知ったものの、一体何に使うんだろうこれ中々活用法を見出だせずにいた文字リテラルに関して、何か使い道が無いか考えてみたというネタ記事雑記となります
今回見出だした用途
以下のような挙動を示すために、pメソッド等を埋め込んでの軽い動作確認時などにもしかしたら若干便利かもしれません
[1] pry(main)> ?A*100
=> "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
p ?🐌*10
"🐌🐌🐌🐌🐌🐌🐌🐌🐌🐌"
文字リテラルの大まかな挙動
?a → "a"、?あ→"あ"というように、?マークの直後に何か1文字を置くと、その文字を返すという挙動を示す。2文字以上置くと構文エラーとなります
Running via Spring preloader in process 150
Loading development environment (Rails 7.0.7.2)
[1] pry(main)> ?A
=> "A"
[2] pry(main)> ?あ
=> "あ"
[3] pry(main)> ?🐌
=> "🐌"
[4] pry(main)> ?AA
SyntaxError: unexpected '?'
[4] pry(main)>
返り値は文字列(string)となるため、String#+や*が適用できます。そのため🐌を大量発生させてターミナル上でとても目立たせたり出来る(開発チーム内で流行)
[1] pry(main)> ?A*100
=> "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
[2] pry(main)> ?A + ?B
=> "AB"
[3] pry(main)>
p ?🐌*1000
文字リテラルは現在非推奨となっているため、使用しているとRubocopに指摘されてしまうのですが、これによって万が一の消し忘れのリスクなどを軽減出来るかも(?)
Offenses:
app/controllers/test_controller.rb:9:5: C: [Correctable] Style/CharacterLiteral: Do not use the character literal - use string literal instead.
p ?A*100
^^
app/controllers/test_controller.rb:9:7: C: [Correctable] Layout/SpaceAroundOperators: Surrounding space missing for operator *.
p ?A*100
^
27 files inspected, 2 offenses detected, 2 offenses autocorrectable
何故非推奨なのか?
それには主に以下のような理由があるそうです
挙動が直感的で無いと感じる人も多いため
例えば、もし以下のようなコードを突然提示されたとしたら、(私を含めて)暫く困惑する方もいらっしゃるのではないでしょうか?
[1] pry(main)> x = 5
=> 5
[2] pry(main)> ?x
=> "x"
[3] pry(main)>
Ruby 1.9を境に動作が大きく変化しているため
Ruby1.8以前の往時の文字リテラルは、「文字に対応するUTF-8/ASCIIコードを返す」という、現在のString#ordに近い挙動をしていたという過去を持つため、見る人によって想像する処理の内容が異なる可能性があります
[1] pry(main)> "a".ord
=> 97
まとめ
個人的に活用法を見出だせずにいた文字リテラルでしたが、軽微な動作確認やデバッグ時に🐌をより簡便に量産できるため意外と役立つかもしれないと感じました。
他のメソッドに関しても便利な使い道がないか日常的に探っていければと思います😊
参考にさせて頂いた記事