2017-12-15 11 views
-2

typespecを定義するときにバイナリ、String.t、char_list、[char]などの間で異なるものはありますか?typespec内のバイナリ、String.t、char_list、[char]の違い

@spec method(binary) :: binary 

@spec method(String.t) :: String.t 

彼らは同等か? Doc:

  • バイナリエリクシール文字列に使用されます。
  • char_list Erlang文字列に使用されます。 [char]と定義されています。
+2

ほんの数時間前に、 'binary()'に_an alias_があると明記されているように、https://hexdocs.pm/elixir/String.html#t:t/0 'String.t'というリファレンスが提供されました。 '[char]'はまったく別のものです。 – mudasobwa

+0

http://elixir-lang.github.io/getting-started/binaries-strings-and-char-lists.html –

+0

@mudasobwaあなたの役に立たないコメント、50kの評判に感謝し、あなたは質問を正しく読むことができません。 – lapinkoira

答えて

3

String.tは、binaryと同じです。その定義はhereです。

char_listは、文字の単純なリスト以上のものです。あることをErlangでunicodeモジュールで定義されています:

maybe_improper_list(char() | unicode_binary() | charlist(), 
        unicode_binary() | []) 

だから、適切と不適切な両方のリストが含まれており、リストは文字、バイナリ、またはcharlistsまたは空のリストを含めることができます。

+0

したがって、binaryとString.tが同じ場合、typespecにString.tまたはbinaryを使用するベストプラクティスがあるかどうかを知っていますか? – lapinkoira

+1

私は覚えていることを今すぐ見つけることができません。文字列データ(UTF-8)に 'String.t'を使用し、任意のデータに対して' binary'を使用することをお勧めします。ネットワークパケット、圧縮データなど – Dogbert

+0

@DogbertはElixirで定義されている種類のリストの中の[Notes](https://hexdocs.pm/elixir/typespecs.html#notes)です。前者が後者の別名であるため、 'String.t'と' binary() 'との区別は全く聞いたことがありません。 – mudasobwa

関連する問題