3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【学習備忘録】アウトプットの習慣化を目指したいAdvent Calendar 2023

Day 9

【Rails】文字リテラルの活用法について考えてみた

Posted at

はじめに

Ruby技術者認定試験Goldの対策時に存在を知ったものの、一体何に使うんだろうこれ中々活用法を見出だせずにいた文字リテラルに関して、何か使い道が無いか考えてみたというネタ記事雑記となります

今回見出だした用途

以下のような挙動を示すために、pメソッド等を埋め込んでの軽い動作確認時などにもしかしたら若干便利かもしれません

[1] pry(main)> ?A*100
=> "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
pメソッドと組み合わせてみる
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に近い挙動をしていたという過去を持つため、見る人によって想像する処理の内容が異なる可能性があります

String#ord
[1] pry(main)> "a".ord
=> 97

まとめ

個人的に活用法を見出だせずにいた文字リテラルでしたが、軽微な動作確認やデバッグ時に🐌をより簡便に量産できるため意外と役立つかもしれないと感じました。
他のメソッドに関しても便利な使い道がないか日常的に探っていければと思います😊

参考にさせて頂いた記事

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?