nhpip

nhpip

How do you work with nested modules?

So what’s the idiomatically correct way to do nested modules? I know when applications you tend to do it the first way and follow the directory hierarchy, but when to choose one over the other because I do see it done both ways? The only time I do it the second way is if all I need are a bunch of structs.

defmodule Foo do
   ...
end

then

defmodule Foo.Bar do
    ...
end

VS

defmodule Foo do
 
    defmodule Foo.Bar do
        ...
    end
    ....
end

Most Liked Responses

voughtdq

voughtdq

The only time I ever nest in the file is if it’s for something like state in a GenServer that will only be used internally by that GenServer.

defmodule SomeGenServer do
  use GenServer

  defmodule State do
    # Note that this is actually SomeGenServer.State
    defstruct [x: "", y: "", z: ""]
  end

  @impl true
  def init(_), do: {:ok, %State{}}

  @impl true
  def handle_call(:x_the_x, _from, state) do
    %{x: x} = state
    x = x_the_x(x)
    {:reply, x, %{state | x: x}}
  end

  def x_the_x(x) do
    to_string(x) <> to_string([Enum.random(?A .. ?z)])
  end
end

Otherwise, I define each module in its own file and have the directory structure match that nesting.

tomkonidas

tomkonidas

I would say to let each module have its own file. And to follow the directory tree structure.
It makes it easier to find what you need later on.

voughtdq

voughtdq

I’ve done it before, but it doesn’t feel as explicit. It’s kind of magic for magic’s sake. Thinking back to when I first started using Elixir, I would have been very confused by this because they appear as two separate “declarations”. So I would be looking for what State was and ask, “why is it just referring back to the module?” not realizing that the module itself is the struct. On the contrary, defining it as a nested module gives the beginner a clear understanding of where %State{} actually came from.

Where Next?

Popular in Questions Top

sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID&lt;0.412.0&gt; terminating ** (Postgrex.Error) FATAL...
New
JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

Other popular topics Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
AstonJ
We’ve put together this wiki for Phoenix LiveView - please feel free to add any info you feel is worth including. What is Phoenix LiveV...
New
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I’m a nov...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New

We're in Beta

About us Mission Statement