はじめに
Rubyの%記法に、シンボルの配列を作る%i
%I
という書き方があります。
p %i(a b c) => [:a, :b, :c]
%I
(iが大文字)になると、式展開できます。
a = "sample" p %I(#{a} b c) => [:sample, :b, :c]
この「i」「I」は何の頭文字なのでしょうか?
以下の記事は、FJORD BOOT CAMP(フィヨルドブートキャンプ)の受講生がメンターさんに質問をして、いただいた回答をまとめたものです。
結論
%記法の「i」「I」は、「intern」の頭文字です。
根拠
下のサイトで、%i
%I
の記法が追加されるまでの流れを見ることができます。
当初%i
ではなく%S
が検討されていたようです。
しかし既に存在していた%s
や他の%記法(%w
と%W
など)との関係を踏まえると、%S
では混乱を招く可能性があり、下のような提案がされました。
How about %i and %I? (i stands for "intern").
訳:%i と %I はどうでしょうか? (i は「intern」の略です。)
この会話から「i」は「intern」の頭文字であるということがわかります。
なぜintern?
シンボルを文字列に変換するto_sym
のエイリアスメソッドに、intern
というメソッドがあります。
String#intern (Ruby 3.2 リファレンスマニュアル)
%記法の「i」は、このintern
メソッドからきているようです。
internメソッドの由来
intern
メソッドは、LISPというプログラミング言語に由来して名付けられました。
Ruby | 文字列からシンボルへの変換 String#intern の命名の由来 - Qiita
上のサイトではメーリングリストのリンクにアクセスできなかったのですが、他の会話でinternがLISP由来であると言及がありました。
I guess String#intern came from Lisp,
訳:String#intern は Lisp から来たものだと思います。
Feature #7854: New method Symbol[string] - Ruby master - Ruby Issue Tracking System
internとは
internは「String interning(文字列インターン)」というコンピュータサイエンスの技法です。
Wikipediaが難しくて分からなかったので、ChatGPTに短く説明してもらいました。
「文字列インターン」は、文字列を一意なオブジェクトとして保存・再利用することで、メモリ効率と比較速度を上げる技術です。Rubyでは、この概念はシンボルを通じて実現され、同じシンボルは常に同一のオブジェクトとして扱われます。
まとめ
* %i
はinternの頭文字で、文字列をシンボル化するメソッドintern
が由来。
* intern
はLISP由来の名前で、String interningというコンピューターサイエンスの技法のこと。
補足
Ruby Style Guideを参考に、%記法の役割と元の英単語と思われるものをまとめました。
記法 | 役割 | 元の英単語 |
---|---|---|
% ・%Q | 文字列(ダブルクオート) | Quote |
%q | 文字列(シングルクオート) | quote |
%W | 文字列配列(式展開あり) | Words |
%w | 文字列配列(式展開なし) | words |
%s | シンボル | symbol |
%I | シンボル配列(式展開あり) | Intern |
%i | シンボル配列(式展開なし) | intern |
%r | 正規表現 | regular expressions |
%x | コマンド出力 | execute |
参考にしたサイト
- Ruby Style Guide
- リテラル (Ruby 3.2 リファレンスマニュアル)
- 【Ruby】配列を作るときに使う%記法まとめ - Qiita
- Rubyで%記法(パーセント記法)を使う - Qiita
※String#internの由来について追記・修正しました。(2023/7/21)