すずかのプログラミング勉強記

元教員からエンジニアを目指す、プログラミング勉強記録です。

%記法の「i」「I」は何の頭文字?

はじめに

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の記法が追加されるまでの流れを見ることができます。

Feature #4985: Add %S[] support for making a list of symbols - Ruby master - Ruby Issue Tracking System

当初%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(文字列インターン)」というコンピュータサイエンスの技法です。

String interning - Wikipedia

Wikipediaが難しくて分からなかったので、ChatGPTに短く説明してもらいました。

「文字列インターン」は、文字列を一意なオブジェクトとして保存・再利用することで、メモリ効率と比較速度を上げる技術です。Rubyでは、この概念はシンボルを通じて実現され、同じシンボルは常に同一のオブジェクトとして扱われます。


まとめ

* %iはinternの頭文字で、文字列をシンボル化するメソッドinternが由来

* internLISP由来の名前で、String interningというコンピューターサイエンスの技法のこと。


補足

Ruby Style Guideを参考に、%記法の役割と元の英単語と思われるものをまとめました。

記法 役割 元の英単語
% ・%Q 文字列(ダブルクオート) Quote
%q 文字列(シングルクオート) quote
%W 文字列配列(式展開あり) Words
%w 文字列配列(式展開なし) words
%s シンボル symbol
%I シンボル配列(式展開あり) Intern
%i シンボル配列(式展開なし) intern
%r 正規表現 regular expressions
%x コマンド出力 execute


参考にしたサイト

※String#internの由来について追記・修正しました。(2023/7/21)