Logo

Elixir: Attributes

Sometimes, in a module, you need to put some values into constants, for this use attributes starting with @ sign.

defmodule MyModule do
  @magic_number 8

  def do_magic(num) do
    num * @magic_number
  end
end

MyModule.do_magic(10) # 80

Module attributes are not available from outside the module.

defmodule MyModule do
  @magic_number 8
end

MyModule.@magic_number # raises error

Attributes can be declared several times and redefined, but it should be noted that the compiler inlines the last value of the declared attribute, for example:

defmodule MyModule do
  @magic_number 8

  def cast_magic() do
    @magic_number
  end

  @magic_number 0

  def do_magic() do
    @magic_number
  end
end

MyModule.cast_magic() # 8

MyModule.do_magic() # 0

# after compilation module attributes inlines like this 
defmodule MyModule do
  @magic_number 8

  def cast_magic() do
    8
  end

  @magic_number 0

  def do_magic() do
    0
  end
end

Within modules, there are also special attributes that are used by Elixir to generate documentation, such as the @moduledoc attribute that describes general information about the module or the @doc attribute that documents a declared function:

defmodule MyModule do
  @moduledoc "My attributes exercise module."

  @magic_number 8

  @doc "Do some magic calculations."
  def do_magic(num) do
    num * @magic_number
  end
end

Then, these attributes are used in documentation generation.

You can also make a module attribute accumulate redefined values, with a special attribute declaration, for example:

defmodule MyModule do
 Module.register_attribute __MODULE__, :magic_values, accumulate: true

 @magic_values 8
 @magic_values :some
 @magic_values "hello"

 def do_magic() do
   @magic_values
 end
end

MyModule.do_magic # [8, :some, "hello"]

Instructions

Define the following attributes with values inside the module:

  • Attribute: number_attr, value: 10
  • Attribute: boolean_attr, value: false
  • Attribute: hello_world_attr, value: "Hello, World!"

Tips

If you've reached a deadlock it's time to ask your question in the «Discussions». How ask a question correctly:

  • Be sure to attach the test output, without it it's almost impossible to figure out what went wrong, even if you show your code. It's complicated for developers to execute code in their heads, but having a mistake before their eyes most probably will be helpful.
Found a bug? Have something to add? Pull requests are welcome!