Ruby: マジックコメントのさまざまな利用法(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Ruby: マジックコメントのさまざまな利用法(翻訳)

Rubyソースコードの冒頭部分ではマジックコメント(インタプリタへの指示)がサポートされており、ソースファイルのエンコーディングの設定に使われることはほとんどの方がご存知でしょう。もちろんそれが最もメジャーな利用法ですが、実はそれだけではありません。

ソースファイルのエンコーディング

Rubyの文字列リテラルのデフォルトエンコーディングはUTF-8です。

p "".encoding # => #<Encoding:UTF-8>

これは以下のように変更できます。

# encoding: big5
p "".encoding # => #<Encoding:Big5>

マジックコメントのパーサーはわりと融通が利くので、さまざまな構文をサポートしています。

# Characters before encoding: ascii or after it will not affect its functionality
p "".encoding # => #<Encoding:US-ASCII>

エンコード名は大文字小文字が混ざっていても構いません1

# encOding: bInary
p "".encoding # => #<Encoding:ASCII-8BIT>

encodingの代わりにcodingと書くこともできます(Emacsスタイル)。

# -*- coding: utf-8 -*-
p "".encoding # => #<Encoding:UTF-8>

ただし、ソースエンコーディングはASCII互換でなければなりません。

# encoding: utf-16le
p "".encoding
# UTF-16LE is not ASCII compatible (ArgumentError)

1行目がUNIX Shebangになっていても動作します。

#!/usr/bin/env ruby
# encoding: windows-1250
p "".encoding # => #<Encoding:Windows-1250>

エンコードは、Encoding.findに渡せるものならどれでも構いません。

Encoding.name_list # => ["ASCII-8BIT", "UTF-8", "US-ASCII", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE", "UTF-16", "UTF-32", "UTF8-MAC", "EUC-JP", "Windows-31J", "Big5", "Big5-HKSCS", "Big5-UAO", "CP949", "Emacs-Mule", "EUC-KR", "EUC-TW", "GB2312", "GB18030", "GBK", "ISO-8859-1", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", "ISO-8859-10", "ISO-8859-11", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "ISO-8859-16", "KOI8-R", "KOI8-U", "Shift_JIS", "Windows-1250", "Windows-1251", "Windows-1252", "BINARY", "IBM437", "CP437", "IBM737", "CP737", "IBM775", "CP775", "CP850", "IBM850", "IBM852", "CP852", "IBM855", "CP855", "IBM857", "CP857", "IBM860", "CP860", "IBM861", "CP861", "IBM862", "CP862", "IBM863", "CP863", "IBM864", "CP864", "IBM865", "CP865", "IBM866", "CP866", "IBM869", "CP869", "Windows-1258", "CP1258", "GB1988", "macCentEuro", "macCroatian", "macCyrillic", "macGreek", "macIceland", "macRoman", "macRomania", "macThai", "macTurkish", "macUkraine", "CP950", "Big5-HKSCS:2008", "CP951", "IBM037", "ebcdic-cp-us", "stateless-ISO-2022-JP", "eucJP", "eucJP-ms", "euc-jp-ms", "CP51932", "EUC-JIS-2004", "EUC-JISX0213", "eucKR", "eucTW", "EUC-CN", "eucCN", "GB12345", "CP936", "ISO-2022-JP", "ISO2022-JP", "ISO-2022-JP-2", "ISO2022-JP2", "CP50220", "CP50221", "ISO8859-1", "ISO8859-2", "ISO8859-3", "ISO8859-4", "ISO8859-5", "ISO8859-6", "Windows-1256", "CP1256", "ISO8859-7", "Windows-1253", "CP1253", "ISO8859-8", "Windows-1255", "CP1255", "ISO8859-9", "Windows-1254", "CP1254", "ISO8859-10", "ISO8859-11", "TIS-620", "Windows-874", "CP874", "ISO8859-13", "Windows-1257", "CP1257", "ISO8859-14", "ISO8859-15", "ISO8859-16", "CP878", "MacJapanese", "MacJapan", "ASCII", "ANSI_X3.4-1968", "646", "UTF-7", "CP65000", "CP65001", "UTF-8-MAC", "UTF-8-HFS", "UCS-2BE", "UCS-4BE", "UCS-4LE", "CP932", "csWindows31J", "SJIS", "PCK", "CP1250", "CP1251", "CP1252", "UTF8-DoCoMo", "SJIS-DoCoMo", "UTF8-KDDI", "SJIS-KDDI", "ISO-2022-JP-KDDI", "stateless-ISO-2022-JP-KDDI", "UTF8-SoftBank", "SJIS-SoftBank", "locale", "external", "filesystem", "internal"]

コメントでマジックを実演

マジックコメントの使いみちは、エンコーディングの指定以外にまだ2つあります。ここで注意しなければならないのは、エンコーディングのコメントは最初に書かないと機能しないということです。

文字列のfreeze

Ruby 2.3で、デフォルトですべての文字列リテラルをfreezeする機能が導入されました。

# encoding: stateless-iso-2022-jp-kddi
# frozen_string_literal: true
p "".frozen? # => true
p "".encoding # => #<Encoding:stateless-ISO-2022-JP-KDDI>

--enable-frozenコマンドラインオプションで文字列リテラルをfreezeすることも可能ですが、このマジックコメントはソースファイルでのこのデフォルトの振る舞いを常に上書きします。

インデントのwarning

# warn_indent: true
def method_name
  end

# warning: mismatched indentations at 'end' with 'def' at 2

このwarningは、-wコマンドラインオプションを指定した場合にも表示されますが、このマジックコメントはソースファイルでのこのデフォルトの振る舞いを常に上書きします。

関連記事

Rubyの内部文字コードはUTF-8ではない…だと…?!


  1. ASCIIエンコーディングとの違いについてはUS-ASCII-8BITをご覧ください。 
デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ