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) # 80Module attributes are not available from outside the module.
defmodule MyModule do
@magic_number 8
end
MyModule.@magic_number # raises errorAttributes 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
endWithin 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
endThen, 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.
Your exercise will be checked with these tests:
defmodule Test do
use ExUnit.Case
use Solution
test "solution module attributes" do
assert @number_attr == 10
refute @boolean_attr
assert @hello_world_attr = "Hello, World!"
end
endTeacher's solution will be available in:
20:00
