私はエリクサーを始めたばかりです。標準のEnumモジュールを使用せずに、自分で実装している単純なEnumerable関数に対してExUnitを使用していくつかのテストを書いています。
私のテストでは、リスト[7, 8, 9]
を参照するたびに、標準出力に出力されると、文字リスト'\a\b\t'
が表示されることがわかりました。なぜこのようなことが起こるのですか?
Elixirには、バイナリ(二重引用符で囲まれた)と文字リスト(単一引用符で囲まれた)の2種類の文字列があります。後者のバリアントはErlangから継承され、内部的には文字列のコードポイントにマッピングされる整数のリストとして表されます。
inspect
やIO.inspect
などの関数を使用すると、Elixirはスマートになり、読みやすいように整数のリストを文字列としてフォーマットします。ただし、リスト内のすべての整数がたまたま有効なコードポイントであるという理由だけで、意味のない文字列になる場合もあります。たとえば、A〜Zの文字は、ASCIIでは65〜90の整数として表されます。
iex> IO.inspect [65, 66, 67]
'ABC'
生のリストを印刷したい場合は、charlists: :as_lists
オプションを使用できます。オプションの完全なリストについては、iex
を起動し、h Inspect.Opts
と入力してください。
iex> IO.inspect [65, 66, 67], charlists: :as_lists
[65, 66, 67]
Elixir <1.4では、char_lists: false
を使用できます。
ちなみに、これはElixirが基礎となる構成要素を非表示にする唯一のケースではなく、バイナリ(二重引用符で囲まれた文字列)と構造体でも発生します。
これのより深い理由は、ElixirとErlangがユーザー定義型を持たないことです。両方が単なるリストであるため、リストと単一引用符付き文字列を区別する方法はありません。ただし、これは他の状況でも長所になる可能性があります。たとえば、ElixirとErlangのデータ構造を簡単にシリアル化できます。これは、言語に付属する基本的なビルディングブロックからしか構築できないためです。
@Patrickの答えは完全に正しいですが、IEx
を常に手動でcharlists
を呼び出す代わりに、通常のリストとして常に表示するようにinspect
を構成することもできます。
iex> IEx.configure(inspect: [charlists: :as_lists])
# => :ok
iex> [65, 66, 67]
# => [65, 66, 67]
iex> 'ABC'
# => [65, 66, 67]
サポートされているオプションの完全なリストは次のとおりです