Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Elixir
/

Атрибуты

Elixir: Атрибуты

Иногда в модуле нужно вынести значения в константы. Для этого используются атрибуты, которые начинаются со знака @:

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"]

Задание

Определите внутри модуля следующие атрибуты со значениями:

  • Атрибут: number_attr, значение: 10
  • Атрибут: boolean_attr, значение: false
  • Атрибут: hello_world_attr, значение: "Hello, World!"

Полезное

  • Пример с документацией библиотеки

  • Официальная документация

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
/
Программирование
/
Курс Elixir
/

Атрибуты

Elixir: Атрибуты

Иногда в модуле нужно вынести значения в константы. Для этого используются атрибуты, которые начинаются со знака @:

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"]

Задание

Определите внутри модуля следующие атрибуты со значениями:

  • Атрибут: number_attr, значение: 10
  • Атрибут: boolean_attr, значение: false
  • Атрибут: hello_world_attr, значение: "Hello, World!"

Полезное

  • Пример с документацией библиотеки

  • Официальная документация

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
← ПредыдущийСледующий →
← ПредыдущийСледующий →
← ПредыдущийСледующий →

Ваше упражнение проверяется по этим тестам

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
end
← ПредыдущийСледующий →

Решение учителя откроется через:

20:00

waiting_clock
← ПредыдущийСледующий →