MickeyOoh

MickeyOoh

Programming Elixir page 80 about “defstruct”

I first ask question and I am a quite beginner. I followed this book again to confirm each steps’ process.

Following book by using iex, it works. But implemented IO.puts into code and did “Elixir defstruct.exs” so that it didn’t work with Error.
please help me why the error occur and how to solve this.
code:

defmodule Subscriber do
  defstruct name: "", paid: false, over_18: true
end
s1 = %Subscriber{}
IO.puts inspect(s1)

Error:
** (CompileError) defstruct.exs:5: cannot access struct Subscriber, the struct was not yet defined or the struct is being accessed in the same context that defines it

Showing Posts 1 to 7

OvermindDL1

OvermindDL1

You have your lines of:

s1 = %Subscriber{}
IO.puts inspect(s1)

Outside of a function, you should put them in a function.

You can also run it in iex directly as well:

iex1> defmodule Subscriber do
...1>   defstruct name: "", paid: false, over_18: true
...1> end
{:module, Subscriber,
 <<70, 79, 82, 49, 0, 0, 5, 124, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 146,
   0, 0, 0, 13, 17, 69, 108, 105, 120, 105, 114, 46, 83, 117, 98, 115, 99, 114,
   105, 98, 101, 114, 8, 95, 95, 105, 110, ...>>,
 %Subscriber{name: "", over_18: true, paid: false}}
iex2> s1 = %Subscriber{}
%Subscriber{name: "", over_18: true, paid: false}
iex3> IO.puts inspect(s1)
%Subscriber{name: "", over_18: true, paid: false}
:ok
voger

voger

Everything in elixir should be in a module. Try this in your file.

defmodule Subscriber do
  defstruct name: "", paid: false, over_18: true
end

defmodule Run do
  s1 = %Subscriber{}
  IO.puts inspect(s1)
end
NobbZ

NobbZ

I do not think so!

Defining a struct and using it in the following script is essential in scripting with elixir.

voger

voger

Yes you are right indeed. My mistake. I don’t know why I had this impression.

MickeyOoh

MickeyOoh OP

Thanks for leading me. However, this issue comes out using “Elixir defstruct.exs” although using iex as you said works correctly.

In addition, I think “iex” and “elixir” packages are different in my environment. I might miss installing correctly. When I checked “mix deps.get”, errors happen and are still unresolved.

peerreynders

peerreynders

The issue is with the phases that the Elixir compiler goes through.

While this

defmodule Subscriber do
  defstruct name: "", paid: false, over_18: true

end
s1 = %Subscriber{}
IO.puts inspect(s1)

results in an error, the following does not

defmodule Subscriber do
  defstruct name: "", paid: false, over_18: true

  def new,
    do:  %Subscriber{}

end
s1 = Subscriber.new()
IO.puts inspect(s1) 

During compilation the expansion phase happens before the evaluation phase. However the functionality of a module isn’t “defined” and available until it has been evaluated during the evaluation phase. So when the compiler comes across

s1 = %Subscriber{}

during the expansion phase it tries to expand %Subscriber{} - the problem is that %Subscriber{} is part of the Subscriber module which won’t be defined until later in the evaluation phase - so during the expansion phase there is no definition for %Subscriber{} (yet).

s1 = Subscriber.new()

doesn’t have anything to expand - it is simply a function call that is evaluated during the evaluation phase - by that point in time the Subscriber module has been fully evaluated and both %Subscriber{} and Subscriber.new() are defined and available.

See also

Main phases of Elixir compilation

MickeyOoh

MickeyOoh OP

peerreynders, Thank you so much.
I corrected my codes as what you said and it works. And I learned a lot from you.

modified code:

defmodule Subscriber do  
  defstruct name: "", paid: false, over_18: true

  def run do
    s1 = %Subscriber{}
    IO.puts inspect(s1)
    s2 = %Subscriber{name: "Dave"}
    IO.puts inspect(s2)
    s3 = %Subscriber{ name: "Mary", paid: true}
    IO.puts inspect(s3)
    IO.puts "#{s3.name}"
    %Subscriber{name: a_name} = s3
    IO.puts a_name
    s4 = %Subscriber{ s3 | name: "Marie"}
    IO.puts inspect(s4)
  end 
end

Subscriber.run()
— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New
dillonoconnor
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews