1. poly_soft

    No comment

    poly_soft
Changes in body
Source | HTML | Preview
@@ -1,54 +1,54 @@
Elixirの色々なパッケージのコードを見ていると、下記のような@specディレクティブが頻繁に登場します。
```ex
@spec foo(Bar.t | t) :: t
```
(@specディレクティブに関しては[こちら](http://elixir-lang.org/getting-started/typespecs-and-behaviours.html#function-specifications)をご参照ください)
「この"t"ってなんだよ?」と思ったことはありませんでしょうか?
# "t"について
ということで調べてみましたが、結論から言うと上記の"t"は、それぞれのモジュールで
```ex
@type t :: 色々な型定義
```
のような感じで定義されています。多くの場合は
```ex
@type t :: %__MODULE__{〜構造体のフィールドの型定義を羅列〜}
```
のような感じで、そのモジュール内でdefstructで定義している(`%モジュール名`で参照できる)構造体の型情報を返す目的で使用されているようです。
# "remote type"について
Elixirの[typespecsに関するドキュメント](http://elixir-lang.org/docs/v1.1/elixir/Kernel.Typespec.html)の途中に、「remote types」という用語が突然登場します。
![スクリーンショット 2016-02-29 15.15.16.png](https://qiita-image-store.s3.amazonaws.com/0/22932/3494d796-682b-3cf7-3915-ef1094855c59.png)
この「remote type」とは一体なんだろう?ということで調べてみたのですが、これはerlang用語のようです。[こちら]
(http://erlang.org/doc/reference_manual/typespec.html#id78824)で説明されています。
![スクリーンショット 2016-02-29 15.20.49.png](https://qiita-image-store.s3.amazonaws.com/0/22932/ed499b09-1cd7-720f-041a-baf10aaf9ac5.png)
要するに、あるモジュールからexportされて、他のモジュールで参照可能な型定義のことを「remote type」と呼ぶようです。
# まとめ
-Elixirの場合、`@type`で外部にエクスポートする、そのモジュールの型情報を「t」という名称で定義することが慣例のようなので、「remote type」とは要するに`@type t :: 色々な型定義`という形式で定義された、`Hoge.t`のような構文で参照可能な情報のこと、と考えて良いと思われます。
+Elixirの場合、`@type`で外部にエクスポートする、そのモジュールの型情報を「t」という名称で定義することが慣例のようなので、「remote type」とは要するに`@type t :: 色々な型定義`という形式で定義された、`Hoge.t`のような構文で参照可能なそのモジュールの構造体情報のこと、と考えて良いと思われます。
# 補足
Elixirの型定義ディレクティブには、`@type`以外にも`@typep`および`@opaque`が使用可能です。[こちら](http://elixir-lang.org/docs/stable/elixir/typespecs.html#defining-a-type)でそれぞれ下記のように説明されています。
> A type defined with @typep is private. An opaque type, defined with @opaque is a type where the internal structure of the type will not be visible, but the type is still public.
`@typep`で定義された型はプライベートになりますので他のモジュールからは参照できません。そのため`@typep`で定義された型は「remote type」とは呼ばないと思われます。
`@opaque`で定義された型は、他のモジュールから参照可能ですが、その内部構造は隠蔽されているため、他のモジュールがその型の内部構造にアクセスするようなコードは不可ということになるようです。(おそらくdialyzer等の静的型チェックツールでチェックするとエラーになるのではないかと思われます)