Иногда в модуле нужно вынести значения в константы. Для этого используются атрибуты, которые начинаются со знака @
:
defmodule MyModule do
@magic_number 8
def do_magic(num) do
num * @magic_number
end
end
MyModule.do_magic(10) # 80
Атрибуты модуля недоступны снаружи модуля:
defmodule MyModule do
@magic_number 8
end
MyModule.@magic_number # возникнет ошибка
Атрибуты можно объявлять несколько раз и перезаписывать. При этом стоит понимать, что компилятор подставляет последнее значение объявленного атрибута, например:
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
# по сути после компиляции модуль будет выглядеть так
defmodule MyModule do
@magic_number 8
def cast_magic() do
8
end
@magic_number 0
def do_magic() do
0
end
end
Еще внутри модулей есть специальные атрибуты, которые используются эликсиром для генерации документации. Например, атрибут @moduledoc
, в котором описывается общая информация о модуле, или @doc
, которым документируется объявленная функция:
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
Затем эти атрибуты используются в генерации документации.
Еще с помощью специального объявления можно заставить атрибут модуля при перезаписи накапливаться, например:
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"]
Определите внутри модуля следующие атрибуты со значениями:
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1defmodule Test do
2 use ExUnit.Case
3 use Solution
4
5 test "solution module attributes" do
6 assert @number_attr == 10
7 refute @boolean_attr
8 assert @hello_world_attr = "Hello, World!"
9 end
10end
11
Решение учителя откроется через: