Ookma-Kyi
I have the following code:
defmodule Servy.Conv do
defstruct method: "", path: "", resp_body: "", status: nil
def full_status(conv) do
"#{conv.status} #{status_reason(conv.status)}"
end
defp status_reason(code) do
%{
200 => "OK",
201 => "Created",
401 => "Unauthorized",
403 => "Forbidden",
404 => "Not Found",
500 => "Internal Server Error"
}[code]
end
end
I get a “could not find struct” error when I update the full_status function to def full_status(%Conv = conv) do, even though the struct is defined above. Additionally, Visual Studio Code mentions
Cyclic module usage
When I try to do this. Any ideas?
Trending in Questions
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
Hello!
Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app.
I creat...
New
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted”
Version...
New
Other Trending Topics
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #blog-post
- #ai
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
gregvaughn
The struct’s module is
Servy.ConvnotConv. You have a few choices. You could use the full module name, or you could alias or you could use the compile time variable__MODULE__. For example:I prefer the compile time variable because if you ever refactor the module and change its name, this will reflect the current name.
Ookma-Kyi
So even though you’re inside the actual struct definition, you still have to alias it, correct? I know the course mentions using
alias, but that was when you wanted to use the struct in another file.gregvaughn
Yes, but it’s even more fundamental than that. The struct “name” is a module name. Even if you were not creating a struct, but in any module you cannot refer to the current module by the leaf part of its name. For example, if you were writing any function within module
Foo.Baryou cannot useBarby itself. You’d have the same 3 options I mentioned.sodapopcan
Just to put what @gregvaughn another way (which is what helped me) is that Elixir doesn’t technically have submodules. The
.is a bit of an illusion and is only meaningful for constructs likealias, otherwise it’s just like any other character in a module name.FooandFoo.Barhave absolutely no relation as far as the VM is concerned.Ookma-Kyi
It’s weird because this is perfectly valid:
sodapopcan
You have
alias Servy.Convat the top of module, unless you’re talking about something else.Ookma-Kyi
I mean that functions inside the module are fine, but structs inside the module still need to be aliased. Just something that I have to get used to, I guess.
sodapopcan
That goes back to what Greg was saying that structs are named after the module itself. This is no different than if you want to use a module within itself: you either have to use
__MODULE__or you can type the full name verbatim.As I said in my previous answer,
Foo.BarandFooare completely different modules. It sounds like you are still thinking of it asBaris a module withinFoo. This is not the case, they are totally independent. Just think of.as an underscore. The.between the module name and the function, however, is an operator, though. It’s separating module and function name.Sorry for the all the edits but I perhaps it’s clearer to say that the
FooinFooand theFooinFoo.Baralso have absolutely no relation.Ookma-Kyi
Cool, thanks everyone. Sorry about the dumb questions. I am still learning Elixir, and slowly but surely I will get there.
garrison
I agree this behavior is confusing; I also think it would be more intuitive to alias the current module into itself. I can’t explain exactly why, it’s just less surprising for some reason.
With that said, obviously there is no changing this now, so it is what it is.
Structs are just maps with an extra
__struct__key set to the module name. Functions are imported into the scope, but structs are not. You can only alias the module name.Note however that defining a nested module aliases that module within the parent, so you can do this:
Even though the actual name of
BisA.B. Which only makes it more confusing tbh.