1. poly_soft

    No comment

    poly_soft
Changes in body
Source | HTML | Preview

Elixirの色々なパッケージのコードを見ていると、下記のような@specディレクティブが色々な箇所に登場します。

@spec foo(Bar.t | t) :: t

(@specディレクティブに関してはこちらをご参照ください)

「この"t"ってなんだよ?」と思ったことはありませんでしょうか?

"t"について

ということで調べてみましたが、結論から言うと上記の"t"は、それぞれのモジュールで

@type t :: 色々な型定義

のような感じで定義されています。多くの場合は

@type t :: %__MODULE__{〜構造体のフィールドの型定義を羅列〜}

のような感じで、そのモジュール内で定義している構造体の型情報を返す目的で使用されているようです。

"remote type"について

Elixirのtypespecsに関するドキュメントの途中に、「remote types」という用語が突然登場します。

スクリーンショット 2016-02-29 15.15.16.png

この「remote type」とは一体なんだろう?ということで調べてみたのですが、これはerlang用語のようです。こちらで説明されています。

スクリーンショット 2016-02-29 15.20.49.png

要するに、あるモジュールからexportされて、他のモジュールで参照可能な型定義のことを「remote type」と呼ぶようです。

まとめ

Elixirの場合、@typeで外部にエクスポートする、そのモジュールの型情報を「t」という名称で定義することが慣例のようなので、「remote type」とは要するに@type t :: 色々な型定義という形式で定義された、Hoge.tのような構文で参照可能な型情報のこと、と考えて良いと思われます。

補足

Elixirの型定義ディレクティブには、@type以外にも@typepおよび@opaqueが使用可能です。こちらでそれぞれ下記のように説明されています。

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等の静的型チェックツールでチェックするとエラーになるのではないかと思われます)