web-dev-qa-db-ja.com

Rubyのマジックコメント(#Encoding:utf-8)はどのように機能しますか?

Rubyのマジックコメントはどのように機能しますか?私が話しているのは:

# Encoding: utf-8

これは前処理指令ですか?このタイプの構造の他の用途はありますか?

35

何らかの理由で、この行はmagic commentと呼ばれます。ソースコードを処理する前に、インタープリターがこの行を読み取り、適切なエンコーディングを設定します。それは私が信じるインタプリタ言語ではかなり一般的です。少なくともPythonは同じアプローチを使用します。

エンコーディングはさまざまな方法で指定できます(一部は編集者に認識されます)。

# encoding: UTF-8
# coding: UTF-8
# -*- coding: UTF-8 -*-

この記事 で、ソースエンコーディングに関する興味深い情報を読むことができます。

私が知っている唯一の類似の構造は Shebang ですが、これは一般的にUnixシェルに関連しており、Ruby固有ではありません。

58
KL-7

このマジックコメントは、Ruby現在解析されているファイルのソースエンコーディングを示します。As Ruby 1.9.xは、デフォルトでUS_ASCII ASCII以外の文字(ウムラウトやアクセント付き文字など)を使用する場合、ソースコードのエンコーディングをインタープリターに指示している。

認識するには、コメントをファイルの最初の行(または使用する場合はシバンの下)にする必要があります。

他のエンコーディング設定があります。詳細は この質問 を参照してください。

バージョン2.0以降、RubyはデフォルトでソースファイルのUTF-8エンコーディングを想定しています。そのため、UTF-でソースコードを記述した場合、このマジックエンコーディングコメントは一般にはあまり見られません。とにかく8。

14
Holger Just

お気づきのように、魔法のコメントは特別な前処理構造です。それらはファイルの先頭で定義する必要があります(ただし、先頭に nix Shebang がある場合を除きます)。 Ruby 2.3以降、3種類の魔法のコメントがあります:

  • コメントのエンコード:他の回答を参照してください。常に最初の魔法のコメントでなければなりません。 ASCII互換性があります。ソースエンコーディングを設定するため、ファイルの実際のエンコーディングが指定されたエンコーディングと一致しない場合、問題が発生します
  • frozen_string_literal: true:現在のファイル内のすべての文字列リテラルをフリーズします
  • warn_indent: true:現在のファイルのインデント警告をアクティブにします

詳細: マジックインストラクション

7
J-_-L