It is common to define a struct together with various functions that access that struct in the module:
defmodule Chat.Channel do
defstruct name: "", public?: true
def new do
%Chat.Channel{name: "Untitled"}
end
def connect(%Chat.Channel{} = channel) do
IO.inspect(channel)
end
end
It is also common to alias the struct for easier access
defmodule Chat.Channel do
defstruct name: "", public?: true
alias Chat.Channel
# ...
end
But, say, renaming the module would require manually replacing all struct occurrences with the new module name. Aliasing can help, but if the last bit should be updated too(say Chat.Channel should be updated to Chat.Room) it would still require to manually replace everything.
There is a workaround to use __MODULE__, but IMO the code looks a bit ugly
defmodule Chat.Channel do
defstruct name: "", public?: true
def new do
%__MODEUL__{name: "Untitled"}
end
def connect(%__MODEUL__{} = channel) do
IO.inspect(channel)
end
end
I think It would be great to have some kind of shortcut(syntactic sugar) to access the struct within the module.
First I thought about something like %_(%%, %. etc) but this way it looks a bit cryptic
def connect(%_{} = channel) do
So maybe something like %self would work
defmodule Chat.Channel do
defstruct name: "", public?: true
def new do
%self{name: "Untitled"}
end
def connect(%self{} = channel) do
IO.inspect(channel)
end
end
What do you think?