Accessing Structs in Elixir

Elixir is a language that runs on the Erlang VM (BEAM) and looks a bit like ruby. It caught my interest, because I wanted to learn something that was different and not very mainstream, a little inspired by the 12 resolutions for programmers post.

Update: check out the suggestions and examples in the reddit thread too

I found myself very confused and googled all kinds of things like

  • How to access property of elixir object
  • How to access key of elixir object
  • How to print property of elixir struct

until I found an example that showed that variable assignment works very much like in Go or the error first callbacks in node.js.

I was trying to print a certain value that belogs to a key on a struct for File.stat like in the following example:

myFile = File.stat("hello.txt")
IO.inspect myFile.access

// output:
** (UndefinedFunctionError) undefined function :ok.access/1 (module :ok is not available)
    :ok.access({:ok, %File.Stat{access: :read_write, atime: {{2016, 1, 27}, {13, 7, 22}}, ctime: {{2016, 1, 27}, {13, 7, 22}}, gid: 1000, inode: 11545547, links: 1, major_device: 41, minor_device: 0, mode: 33188, mtime: {{2016, 1, 27}, {13, 7, 22}}, size: 20, type: :regular, uid: 1000}})
    (elixir) lib/code.ex:363: Code.require_file/2

The trick is to just use two variables from the very beginning, status of the function first.

{status, myFile} = File.stat("hello.txt")
IO.inspect myFile.access
test1.ex:1: warning: variable status is unused

Again, this might be a problem NOBODY else has, but I didn't see a lot of places it was described in the getting started or beginner guides. Only through the File.stat documentation I got the idea to search for structs and look through some examples.

I thought my mistake was that I was trying to access the values of the struct wrongly, but it was actually the variable assignment in elixir that I buggered up. Actually the idea of the error first returns/callbacks is great, because you can test if a previous function has failed before trying to make the rest of your functions cope with some undefined value.

A really neat thing is that the compiler will tell you that you're not using a defined variable.

Tagged with: #elixir #erlang #struct

Thank you for reading! If you have any comments, additions or questions, please tweet or toot them at me!