Size: a a a

2020 March 10

SM

Sergei Maximov in pro.elixir
Смотря что ты хочешь в итоге получить

Вот тебе код с переопределением request, который компилируется:

defmodule Common do
 @callback request(term) :: term

 defmacro __using__(_) do
   quote do
     @behaviour Common

     def get_stat(from, to, opts), do: Common.get_stat(__MODULE__, from, to, opts)

     @impl Common
     def request(opts), do: opts

     defoverridable request: 1
   end
 end

 def get_stat(module, from, to, opts), do: module.request(%{from: from, to: to} |> Map.merge(opts))
end

defmodule A do
 use Common

 def request(opts), do: super(opts) |> Map.put_new(:keys, Map.keys(opts))
end

defmodule B do
 use Common
end
источник

SM

Sergei Maximov in pro.elixir
iex(1)> B.get_stat(1, 2, %{})
%{from: 1, to: 2}
iex(2)> A.get_stat(1, 2, %{})
%{from: 1, keys: [:from, :to], to: 2}
iex(3)> A.get_stat(1, 2, %{opt: :val})
%{from: 1, keys: [:from, :opt, :to], opt: :val, to: 2}
iex(4)> A.get_stat(1, 2, %{keys: [:val1, :val2]})
%{from: 1, keys: [:val1, :val2], to: 2}
источник

DC

Danil Chibrikov in pro.elixir
@smaximov да, увидел. Пока отвечали тоже наткнулся на данное решение, но мне бы не хотелось тащить module внутрь.

Правильно поняли суть, может как-то по другому можно задезайнить
источник

SM

Sergei Maximov in pro.elixir
Danil Chibrikov
@smaximov да, увидел. Пока отвечали тоже наткнулся на данное решение, но мне бы не хотелось тащить module внутрь.

Правильно поняли суть, может как-то по другому можно задезайнить
Если ты про передачу __MODULE__ модулю-поведению (Common), то это распространённая практика, так по сути все и делают.
источник

DC

Danil Chibrikov in pro.elixir
Да, практика распространенная, но в моем случае придется тащить глубоко, чего не хотелось бы
источник
2020 March 11

LL

Lama Lover in pro.elixir
Danil Chibrikov
@smaximov да, увидел. Пока отвечали тоже наткнулся на данное решение, но мне бы не хотелось тащить module внутрь.

Правильно поняли суть, может как-то по другому можно задезайнить
Во-первых, лучше писать defoverridable Common
Во-вторых, можешь get_stat вписать внуть __using__

Суть в том, что тебе нужно скомпилировать одну функцию, в зависимости от другой. Тут два основных решения:
1) Подстановка модуля (почти как "Dependency injection") как тебе уже показал @smaximov
2) Генерация кода в макросе. В данном случае, удобнее всего будет в __using__

В первом случае, код будет меньше по объёму, но медленнее
Во втором случае, кода будет больше по объёму, релиз будет чуть объёмнее. Но будет явный вызов вместо apply, а это быстрее
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Нефик делать спагетти. Кого вообще волнует увеличение размера beam на полтора байта?
источник

ŹR

Źmićer Rubinštejn in pro.elixir
И да, в этом случае apply и M:F будет одинаковыми по скорости, потому что компилятор соптимизирует
источник

ŹR

Źmićer Rubinštejn in pro.elixir
А соптимизирует он потому, что ямы модуля будет известно в compile time
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Так же как и арность по аргументам
источник

a

arikai in pro.elixir
Źmićer Rubinštejn
Нефик делать спагетти. Кого вообще волнует увеличение размера beam на полтора байта?
Что есть спагетти в данном случае?
источник

DC

Danil Chibrikov in pro.elixir
Źmićer Rubinštejn
Нефик делать спагетти. Кого вообще волнует увеличение размера beam на полтора байта?
Именно поэтому пробрасываю модуль, не запутывая все в клубок окончательно
источник

M

Mark in pro.elixir
Господа, написал тут инструкцию - телеграмм бот на фениксе сокетах и все это на локальной машине.
https://medium.com/@7Devs/telegram-bot-on-phoenix-framework-elixir-lang-b87068316956

Может кому полезно будет, а может я там что-то не то написал и полезно будет мне )
источник

IF

Igor Filippov in pro.elixir
Мне точно будет полезно. Спасибо за труд
источник

M

Mark in pro.elixir
Igor Filippov
Мне точно будет полезно. Спасибо за труд
👍
источник

SM

Sergei Maximov in pro.elixir
Mark
Господа, написал тут инструкцию - телеграмм бот на фениксе сокетах и все это на локальной машине.
https://medium.com/@7Devs/telegram-bot-on-phoenix-framework-elixir-lang-b87068316956

Может кому полезно будет, а может я там что-то не то написал и полезно будет мне )
1. Ссылки в TOC не работают
2. Зачем создавать самоподписанный сертификат, если для webhook'а ты всё равно используешь Ngrok? Делай туннель Ngrok'ом на http://localhost:4000
3. bot_token лучше фильтровать из логов (config :phoenix, :filter_parameters, ["bot_token"])
источник

M

Mark in pro.elixir
Sergei Maximov
1. Ссылки в TOC не работают
2. Зачем создавать самоподписанный сертификат, если для webhook'а ты всё равно используешь Ngrok? Делай туннель Ngrok'ом на http://localhost:4000
3. bot_token лучше фильтровать из логов (config :phoenix, :filter_parameters, ["bot_token"])
Какие ссылки не работают ? не понял
источник

SM

Sergei Maximov in pro.elixir
В оглавлении
источник

M

Mark in pro.elixir
Sergei Maximov
В оглавлении
эти ?
источник

M

Mark in pro.elixir
Sergei Maximov
1. Ссылки в TOC не работают
2. Зачем создавать самоподписанный сертификат, если для webhook'а ты всё равно используешь Ngrok? Делай туннель Ngrok'ом на http://localhost:4000
3. bot_token лучше фильтровать из логов (config :phoenix, :filter_parameters, ["bot_token"])
по поводу второго пункта, гляну в течении пары часов.
источник