LoginSignup
14
12

More than 5 years have passed since last update.

Elixirの"t"ってなに? "remote type"ってなに?

Last updated at Posted at 2016-02-29

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

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

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

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

"t"について

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

@type t :: 色々な型定義

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

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

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

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

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12