Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away