Elixirではネストされたモジュールとその親の間には何の関係もないので,ネストしたモジュール内でそのモジュール自身を参照するときは,いちいち頭からモジュール名を全部打っていかないといけません.
defmodule Game.User do
defstruct [:name, :level]
def new(name, level) do
# %User{...} ではダメ
%Game.User{name: name, level: level}
end
end
これを解決するために,以下のようにモジュール内で自分自身へのエイリアスを張ることができます.
defmodule Game.User do
alias Game.User
defstruct [:name, :level]
def new(name, level) do
%User{name: name, level: level}
end
end
こうすれば,単にUser
と書くだけでGame.User
にアクセスできるので,少しだけ書くのが楽になります.
これをもう少しだけ楽に書くtipsとして、以下のようなものがよく使われているようです.
defmodule Game.User do
alias __MODULE__
defstruct [:name, :level]
def new(name, level) do
%User{name: name, level: level}
end
end
Game.User
内では__MODULE__ == Game.User
なので,これは先ほどのalias Game.User
と意味的に同じになり,User
がGame.User
の意味で使えるようになるという理屈です.