TLDR;
What should I emit for inspect/2 output of library structs? Executable code, string representation or default (outputs the struct fields)?
Summary
In April, I changed the output of inspect/2 for Cldr.LanguageTag.t to be executable code rather than the default structural output. I did this to align with what I understood is the emerging pattern for Elixir structs but not everyone agrees.
I decided to review the inspect/2 output for all the Elixir core structs (summary below)
It appears, as I had understood, that most structs emit executable code these days. Using a sigil if one is part of kernel and a function call if not.
The ones that do not emit executable code appear to do so because there is no mapping from the struct to code - perhaps because the struct holds some state like File.Stream. And it makes sense for a PID to be represented a a string because the struct is opaque. I think URI might be an outlier - it could be URI.parse!(uri_string) I think, without losing any information.
I didn’t seen anything in the Elixir Antipatterns guide.
What is core teams guidance and what are community expectations for inspect/2 output for a struct?
Output executable code
- Date
- Time
- DateTime
- Date.Range
- NaiveDateTime
- Regex
- MapSet
- Range
- Exceptions (emit their name only, which I count as code)
Output structure
- URI
- File.Stream
- Version
Output string representation
- PID






















